Sql 如何在子选择中转换和不转换以加入?

Sql 如何在子选择中转换和不转换以加入?,sql,postgresql,join,subquery,Sql,Postgresql,Join,Subquery,我有: 这种转换似乎不起作用: with cm as (select n from tbl1 where c = 41) select nn from tbl2 where n in (select n from cm) and nn not in (select n from cm); 无论哪种方式,您都必须加入同一个表两次。 使用联接而不是在中: 以cm为单位,从tbl1中选择n,其中c=41 选择t.nn 来自tbl2 t 将cm c1连接到c1上。n=t.

我有:

这种转换似乎不起作用:

with cm as (select n from tbl1 where c = 41)    
select nn from tbl2  
where 
    n in (select n from cm) and
    nn not in (select n from cm);

无论哪种方式,您都必须加入同一个表两次。 使用联接而不是在中:

以cm为单位,从tbl1中选择n,其中c=41 选择t.nn 来自tbl2 t 将cm c1连接到c1上。n=t.n 左侧连接c2上的cm c2。n=t.nn 其中c2.n为空; 不带CTE的情况相同:

选择t.nn 来自tbl2 t 使用n-等效于t1上的n连接tbl1 t1。此处n=t.n 在t2上左连接tbl1 t2。n=t.nn t2.c=41-必须到这里! 其中t1.c=41 t2.n为空; 要求cm.n是唯一的/tbl1.n对于tbl1.c=41是唯一的

见:

虽然cm.n从不为空,但您的原创作品也是:

以cm为单位,从tbl1中选择n,其中c=41 选择t.nn 来自tbl2 t 其中n在表cm中 和nn不在表cm中; 用简短的语法表简化。见:

但我宁愿用不存在代替不存在。通常速度更快,使用空值时不会意外失败

以cm为单位,从tbl1中选择n,其中c=41 选择t.nn 来自tbl2 t 如果存在,从cm中选择,其中n=t.n 不存在,从cm中选择,其中n=t.nn EXISTS不会像中那样复制行。当涉及空值(如JOIN)时,它会按预期工作。所以这通常是我的第一选择

见:


无论哪种方式,您都必须加入同一个表两次。 使用联接而不是在中:

以cm为单位,从tbl1中选择n,其中c=41 选择t.nn 来自tbl2 t 将cm c1连接到c1上。n=t.n 左侧连接c2上的cm c2。n=t.nn 其中c2.n为空; 不带CTE的情况相同:

选择t.nn 来自tbl2 t 使用n-等效于t1上的n连接tbl1 t1。此处n=t.n 在t2上左连接tbl1 t2。n=t.nn t2.c=41-必须到这里! 其中t1.c=41 t2.n为空; 要求cm.n是唯一的/tbl1.n对于tbl1.c=41是唯一的

见:

虽然cm.n从不为空,但您的原创作品也是:

以cm为单位,从tbl1中选择n,其中c=41 选择t.nn 来自tbl2 t 其中n在表cm中 和nn不在表cm中; 用简短的语法表简化。见:

但我宁愿用不存在代替不存在。通常速度更快,使用空值时不会意外失败

以cm为单位,从tbl1中选择n,其中c=41 选择t.nn 来自tbl2 t 如果存在,从cm中选择,其中n=t.n 不存在,从cm中选择,其中n=t.nn EXISTS不会像中那样复制行。当涉及空值(如JOIN)时,它会按预期工作。所以这通常是我的第一选择

见:


请添加一些示例数据和预期输出。请添加一些示例数据和预期输出。已使用现有版本。。。感谢使用了EXIST版本。。。谢谢
 select tbl2.nn from tbl2 join tbl1
 on tbl1.n = tbl2.n and tbl1.n != tbl2.nn
 where tbl1.c = 41;