我想让那些没有参加计划的所有无薪男性客户
SELECT cr.id, cr.type FROM mydb.customer cr
JOIN mydb.plan1 p1 on cr.id != p1.id
JOIN mydb.plan2 p2 on cr.id != p2.id
JOIN mydb.plan3 p3 on cr.id != p3.id
WHERE cr.type = 'male'
此查询是否正确?
答案 0 :(得分:3)
您可以使用一系列三个左连接以及IS NULL
:
SELECT cr.id, cr.type
FROM mydb.customer cr
LEFT JOIN mydb.plan1 p1
ON cr.id = p1.id
LEFT JOIN mydb.plan2 p2
ON cr.id = p2.id
LEFT JOIN mydb.plan3 p3
ON cr.id = p3.id
WHERE p1.id IS NULL AND p2.id IS NULL AND p3.id iS NULL AND
cr.type = 'male'
答案 1 :(得分:0)
由于您似乎只需要id
,EXCEPT
应该是一个不错的选择:
SELECT id FROM mydb.customer WHERE type = 'male'
EXCEPT ALL SELECT id FROM mydb.plan1
EXCEPT ALL SELECT id FROM mydb.plan2
EXCEPT ALL SELECT id FROM mydb.plan3;
确切地说:EXCEPT ALL
:
基本技巧:
如果由于中间派生表中的行的乘法,每个表可以具有多个相关行,则多个连接的执行速度可能不会很快。只需使用EXPLAIN ANALYZE
测试效果。