2011-11-03 68 views
2

我有如下表:加入到同一個表中的SQL - SQL Server 2008中

ID Type Description IDOfSystem 
-------------------------------- 
1000 Company Company Item NULL 
1010 System System Item NULL 
1020 Company NULL   1010 

我有系統和公司項目。我需要編寫一個選擇查詢來獲取所有公司項目和系統項目,除非公司項目的值爲IDOfSystem我需要排除該系統項目並從系統項目獲取描述。

因此,鑑於上表,SQL select應該返回行1000,1020(帶有「系統項」)作爲描述。

如果1020不存在,我只是得到1000和1010

我想我可以打破這種成多個查詢,並做了UNION。我試圖在同一張表上做左外連接,但無法從系統行獲取描述。

任何幫助?

回答

0

該方法使用自連接來查找相應系統的描述。一個單獨的子查詢會過濾掉被引用的系統。

select yt1.Id 
,  yt1.Type 
,  coalesce(yt2.Description, yt1.Description) as Description 
from YourTable yt1 
left join 
     YourTable yt2 
on  yt1.type = 'Company' 
     and yt2.type = 'System' 
     and yt2.ID = yt1.IDOfSystem 
where yt1.type in ('System', 'Company') 
     and not exists 
     (
     select * 
     from YourTable yt3 
     where yt1.type = 'System' 
       and yt3.type = 'Company' 
       and yt1.ID = yt3.IDOfSystem 
     ) 

Working example at SE Data.

+0

他也想用系統描述(而不是公司)替換引用系統的行描述 –

+0

@Dylan Smith:你說得對,我會編輯答案,謝謝 – Andomar

+0

這不會給我係統項目的描述。這是一個空字符串:( – Nick

1
SELECT 
    Companies.ID 
    ,Companies.Type 
    ,COALESCE(Systems.Description, Companies.Description) as Description 
FROM YourTable Companies 
LEFT OUTER JOIN YourTable Systems on Systems.ID = Companies.IDOfSystem 
WHERE NOT EXISTS 
(
    SELECT * FROM YourTable T3 WHERE T3.IDOfSystem = Companies.ID 
) 

Here它在SEDE上運行。

+0

,因爲我沒有得到系統的描述這不起作用 – Nick

+0

您可以檢查出的這一個工作示例[這裏](http://data.stackexchange.com/stackoverflow/q/116529/)。感謝@Andomar爲我提供了有關SEDE是多麼有用的啓發。 – kevev22

1
SELECT ID, Type, Description 
FROM MyTable AS A 
WHERE IDOfSystem IS NULL AND NOT EXISTS (SELECT * 
             FROM MyTable AS B 
             WHERE B.IDOfSystem = A.ID) 
UNION ALL 
SELECT A.ID, A.Type, B.Description 
FROM MyTable AS A INNER JOIN MyTable AS B ON A.IDOfSystem = B.ID 
WHERE IDOfSystem IS NOT NULL 

我在做什麼,首先選擇的是沒有一個參考的系統,而不能用作其他一些行系統中的所有行。

然後我正在做另一個查詢的聯合,查找所有具有引用系統的行,並加入到系統中以獲取它的描述。

+0

如果可能的話,我想盡量避免使用「union」,因爲真正的查詢非常龐大而且很難複製它。 – Nick

+0

是的,我試圖想到一種沒有UNION的方法,我不能想出一個簡單的方法。如果沒有人以非工會的方式跳進去,我可能稍後會寫些東西。 –

0

我敢肯定有這樣做的更好的方法,但嘗試:

SELECT A.Id, A.Type, ISNULL(A.Description,B.Description) Description, A.IDOfsystem 
FROM YourTable A 
LEFT JOIN YourTable B 
ON A.IDOFSystem = B.ID 
WHERE A.ID NOT IN (SELECT IDOfsystem FROM YourTable WHERE IDOfsystem IS NOT NULL)