2014-07-05 49 views
1

我有4張桌子。如何選擇除一些項目以外的所有內容?

第一個表格中的每個項目都通過第二個和第三個表格鏈接到最後一個表格中的一些項目。

這就是:

SELECT DISTINCT a1.Name, a2.Name, st.Name, st.ID 
FROM Agents a1 
INNER JOIN Agents a2 ON a1.Owner = 1 AND a1.ID = a2.AgentID 
INNER JOIN AgentGTP ag ON ag.AgentID = a2.ID 
INNER JOIN GTP   ON GTP.ID = ag.GTPID 
INNER JOIN Stations st ON st.ID = GTP.StationID 


我:

enter image description here使用此代碼

我選擇所有合適的項目(我指的是在最後一個表黑字)需要選擇上表中的所有灰色項目。 我該怎麼做?

回答

2

我很難驗證這個沒有數據,但是這可能工作;

SELECT st.* 
FROM Agents a1 
JOIN Agents a2 ON a1.Owner = 1 AND a1.ID = a2.AgentID 
JOIN AgentGTP ag ON ag.AgentID = a2.ID 
JOIN GTP   ON GTP.ID = ag.GTPID 
RIGHT 
JOIN Stations st ON st.ID = GTP.StationID 
WHERE GTP.ID IS NULL 
+0

是的,這是完美的,正是我需要的,謝謝! 但是你可以解釋一下'RIGHT JOIN'和'WHTP GTP.ID是NULL'到底在做什麼嗎? – lucifer63

+0

在這種情況下,Stations是「正確」表格 - 意味着所有行都會返回,無論在「左側」表格(GTP)中是否存在匹配的行。因此,在GTP中沒有匹配記錄的地方,GTP中的所有字段都將顯示爲NULL。也許這會解釋得更好一點; http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ – MarkD

+0

這有點複雜但可以理解。 感謝您的幫助! – lucifer63

1

我覺得這是它:

SELECT * FROM Stations S 
WHERE 
    S.ID NOT IN 
(
    SELECT DISTINCT st.ID 
    FROM Agents a1 
    INNER JOIN Agents a2 ON a1.Owner = 1 AND a1.ID = a2.AgentID 
    INNER JOIN AgentGTP ag ON ag.AgentID = a2.ID 
    INNER JOIN GTP   ON GTP.ID = ag.GTPID 
    INNER JOIN Stations st ON st.ID = GTP.StationID 
) 
+0

它幫助! 但也許它可以在一個查詢中完成?我的意思是隻使用一個'選擇' – lucifer63

相關問題