我正在努力加入3张桌子,我正在尝试加入并排除某些结果。 基本上它与mysql join where not exists几乎相同,但我仍然无法弄清楚如何成功组合多个表。
目标是从表A中选择结果,其中中间表B 中的行为空 OR 其中表C(链接到B,但不是A) )与特定值不匹配。
类似的东西:
SELECT x
FROM tablea
LEFT JOIN tableb
ON tablea.x = tableb.x
LEFT JOIN tablec
ON tableb.y = tablec.y
WHERE tableb.x IS NULL
OR tablec.z != 'excluded'
但它不起作用。 我还想避免像使用NOT IN或NOT EXISTS这样的子查询以加快速度...任何建议?
编辑:尽管我之前说过,它应该有效。只需记住在合并多个连接时仔细检查正确的大括号,嵌套和'where'子句位置答案 0 :(得分:1)
这应该通过一个查询来完成,并且速度相当快。 :)
SELECT x
FROM tablea
LEFT JOIN tableb ON tablea.x = tableb.x
LEFT JOIN tablec ON tableb.y = tablec.y AND tablec.z != 'excluded'
WHERE
tableb.x IS NULL
OR tablec.y IS NOT NULL
这是假设您不介意从tablea获取行,其中tableb.x为null且tablec.y为null,或者它们都不是。如果只想要tablea中的行,其中tableb.x或tablec.y包含值,则需要将OR更改为XOR。
答案 1 :(得分:0)
这实际上是两个单独的查询,因此请使用UNION
:
SELECT tablea.*
FROM tablea
LEFT JOIN tableb ON tablea.x = tableb.x
WHERE tableb.x IS NULL
UNION
SELECT tablea.*
FROM tablea
LEFT JOIN tablec ON tableb.y = tablec.y AND tablec.z != 'excluded'
P.S。如果不使用那种疯狂的“表名对齐”样式格式化SQL,那么你的生活会更容易。在许多年编写SQL之后,我发现这是最容易阅读的