【问题标题】:Simple SQL JOIN Query简单的 SQL JOIN 查询
【发布时间】:2012-09-21 07:53:11
【问题描述】:

即使是简单的JOIN 查询,我仍然遇到困难。从我上一个问题Simple but nested SELECT query 中,我学到了很多东西,但仍然无法完成我的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,如果表 e,f,g 上存在任何 a.id, b.idx, c.id, d.id DOESN'T,则返回结果.例如,如果c.id 存在于e.id 上,那么它应该从表c 中删除该行。如果a.id 存在于g.id 上,则不应继续,因为如果您从查询中删除a.id,则其他部分不应返回任何内容。

我已经制作了一个示例数据库结构,您可以在此处查看 sql 代码:Sample.sql

【问题讨论】:

    标签: sql join


    【解决方案1】:

    你的意思是这样的?

    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)
    

    【讨论】:

    • 嘿,它可以工作,但是当我在“f”中有“c.id”时,它会返回“c.value,d.value”的两个“NULL”值。顺便说一句,我希望它只返回'c.value'的'NULL'或至少'0'行而不是一对'NULL'值。这可能吗?
    【解决方案2】:

    不确定您的 SQL 方言,但您可以使用 MySQL:

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

    【讨论】:

    • 谢谢!为什么选择1?我可以使用“选择空”吗?一样吗?
    • exists 检查是否存在至少一行,因此您可以选择任何内容,包括 null
    • 另外,请使用@lc 的答案,这实际上比我的更准确^^;
    猜你喜欢
    • 2017-10-26
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多