2014-07-05 51 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

相关问题