2016-04-03 74 views
-2

这是我的表是帐户我需要在SELECT语句中的查询帮助

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

首先,它看起来像表结构不是很好设计。这是与父帐户链接的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小提琴: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

+0

这是帮我,但它返回一些冗余数据 –