加入查询不相等

时间:2016-05-09 06:03:48

标签: sql database postgresql

我想让那些没有参加计划的所有无薪男性客户

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'

此查询是否正确?

2 个答案:

答案 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)

由于您似乎只需要idEXCEPT应该是一个不错的选择:

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测试效果。