2012-09-21 116 views
1

即使简单的JOIN查询仍然存在困难。从我最后一个问题,Simple but nested SELECT query,我学到了很多东西,但仍然无法完成我的JOIN查询。 :(简单的SQL JOIN查询

我从last question此查询,它的工作:

SELECT c.value, d.value 
FROM a 
LEFT JOIN b 
    ON a.id = b.idy 
LEFT JOIN c 
    ON b.idx = c.id 
LEFT JOIN d 
    ON b.idx = d.id 
WHERE a.name = "test" 

现在,我想另一个条件添加到查询一下表上e,f,g,如果任何的a.id, b.idx, c.id, d.id存在于表e,f,g,然后返回结果。例如,如果存在于e.idc.id那么它应该从表c消除了行。如果存在于g.ida.id,它不应该,因为继续,如果你脱下a.id从查询中,其他部分不应该返回任何东西。

我做了一个样本数据库结构,你可以看到SQL代码在这里:Sample.sql

回答

2

你的意思是这样的吗?

SELECT c.value, d.value 
FROM a 
LEFT JOIN b 
    ON a.id = b.idy 
    AND b.id NOT IN (SELECT e.id FROM e UNION ALL SELECT f.id FROM f UNION ALL SELECT g.id FROM g) 
LEFT JOIN c 
    ON b.idx = c.id 
    AND c.id NOT IN (SELECT e.id FROM e UNION ALL SELECT f.id FROM f UNION ALL SELECT g.id FROM g) 
LEFT JOIN d 
    ON b.idx = d.id 
    AND d.id NOT IN (SELECT e.id FROM e UNION ALL SELECT f.id FROM f UNION ALL SELECT g.id FROM g) 
WHERE a.name = "test" 
AND a.id NOT IN (SELECT e.id FROM e UNION ALL SELECT f.id FROM f UNION ALL SELECT g.id FROM g) 
+0

是的,但我要测试!我的SQL知识很糟糕:( – Mahdi

+0

嘿,它的工作原理,但是当我在'f'中有例如'c.id'时,它会返回'c.value,d.value'的'NULL'值。顺便说一下我希望它只返回'NULL'为'c.value'或至少'0'行不是'NULL'值。这是可能的吗? – Mahdi

+0

它的作品好男人!谢谢你的帮助!:) – Mahdi

2

不知道你的SQL方言,但与MySQL你可以使用:

AND NOT EXISTS(SELECT 1 FROM e WHERE e.idx = b.idx) 
+0

谢谢!为什么选择1?我可以使用'选择空'?一样的? – Mahdi

+2

_exists_检查是否存在至少一行,所以你可以选择任何东西,也包括空值 – mauhiz

+0

,请使用@lc的答案,这实际上比我的更准确^^; – mauhiz