这是我的表称为帐户
Code name
----------- ----------
301 Data1
301001 Data1.1
109 Data2
109001 Data2.1
311 Data3
311001 Data3.1
我想选择所有数据+ 2列,就像这样,其中其他2列中的第一列将是代码中的前3个数字,第二列将是子字符串的名称
Code | name | code2 | name2
----------------------------------------
301 | Data1 | 301 | Data1
301001 | Data1.2 | 301 | Data1
109 | Data2 | 109 | Data2
109001 | Data2.1 | 109 | Data2
311 | Data3 | 311 | Data3
311001 | Data3.1 | 311 | Data3
首先,表结构似乎设计得不太好。最好有一个ParentId列,并带有指向上级帐户的链接(列:Id |代码|名称| ParentId)
在这种情况下,查询将非常简单:
SELECT N.Code, N.Name, M.Code AS Code2, M.Name AS Name2
FROM Accounts AS N
INNER JOIN Accounts AS M ON N.ParentId = M.Id OR N.ParentId IS NULL
但是,如果您对数据库结构没有控制权,并且拥有自己的资产,那么我可以提出一个有问题的解决方案:
SELECT N.Code, N.Name, M.Code AS Code2, M.Name AS Name2
FROM Accounts AS N
INNER JOIN Accounts AS M
ON N.Code LIKE (M.Code + '%') AND CHARINDEX('.', M.Name) = 0
请参见SQL Fiddle:http ://sqlfiddle.com/#!3/474e2/7
查询假定父帐户的名称中没有圆点!
可以基于主帐户代码始终短于子帐户的假设来构建另一个查询:
SELECT N.Code, N.Name, M.Code AS Code2, M.Name AS Name2
FROM Accounts AS N
INNER JOIN Accounts AS M
ON N.Code LIKE (M.Code + '%') AND LEN(N.Code) >= LEN(M.Code)
SQL小提琴:http://sqlfiddle.com/#!3 / 474e2 / 9
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句