2016-04-03 73 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

這是幫我,但它返回一些冗餘數據 –