这是我的表调用帐户
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
答案 0 :(得分:0)
首先,看起来桌面结构设计得不是很好。最好有一个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
但是,如果您无法控制数据库结构并拥有自己拥有的东西 - 我可以提出一个hacky解决方案:
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小提琴: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)