我在select语句Query中需要帮助

时间:2016-04-03 21:10:31

标签: sql sql-server

这是我的表调用帐户

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

1 个答案:

答案 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)

SQL小提琴:http://sqlfiddle.com/#!3/474e2/9