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;