Sql 使用不相等的连接查询

Sql 使用不相等的连接查询,sql,database,postgresql,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' 此查询正确吗?您可以使用一系列三个左联接以及is NULL: SELECT cr.id,

我想让所有未付报酬的男性客户都参加任何计划

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'

此查询正确吗?

您可以使用一系列三个左联接以及
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'

您可以使用一系列三个左连接以及
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'

由于您似乎只需要
id
,因此在这里应该是一个不错的选择:

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;
准确地说:
除了所有

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'
基本技术:


如果由于中间派生表中的行相乘,每个表都可能有多个相关行,则多个联接的执行速度可能不太快。只需使用
EXPLAIN ANALYZE

测试性能,因为您似乎只需要
id
,因此在这里应该是一个不错的选择:

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;
准确地说:
除了所有

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'
基本技术:


如果由于中间派生表中的行相乘,每个表都可能有多个相关行,则多个联接的执行速度可能不太快。只需使用
EXPLAIN ANALYZE

测试性能,我认为该查询似乎不正确。查询使用左连接(通常默认为内部连接),因此您的查询几乎总是产生零结果(P3除外,在P3中您使用了!=子句)@vvs I修复了错误。这个答案不值得投反对票。我认为现在这个查询将永远不会产生任何结果。原因左连接只会在客户拥有全部3个计划的情况下产生结果。使用外部连接来修复考虑。已经取消了投票。@vvs你错了<代码>左联接始终显示
客户
表中的所有客户,无论每个客户是否符合计划。@Tom yes。。我想我混淆了左连接和内连接。。。对不起,我认为这个问题似乎不正确。查询使用左连接(通常默认为内部连接),因此您的查询几乎总是产生零结果(P3除外,在P3中您使用了!=子句)@vvs I修复了错误。这个答案不值得投反对票。我认为现在这个查询将永远不会产生任何结果。原因左连接只会在客户拥有全部3个计划的情况下产生结果。使用外部连接来修复考虑。已经取消了投票。@vvs你错了<代码>左联接始终显示
客户
表中的所有客户,无论每个客户是否符合计划。@Tom yes。。我想我混淆了左连接和内连接。。。对不起,“未付”是如何考虑的?另外:任何这样的问题都最好声明Postgres版本在使用中,并声明一个表定义。“未付”是如何考虑的?另外:任何这样的问题最好声明正在使用的Postgres版本和一个表定义。