基于多个键/列的反联接(SQL)
设置很简单,我想从基于多个键/列的反联接(SQL),sql,postgresql,join,Sql,Postgresql,Join,设置很简单,我想从表A中检索表B中不存在的所有行。因为可以使用4列来识别唯一的行,所以我需要有一种方法来编写WHERE语句,以确保它正常工作 我的解决方案是连接这4列,并将其用作“一”列/键来进行外部连接: select * from table_A where filter_condition = 0 and (column1 || column2 || column3 || column4) not in ( se
表A
中检索表B
中不存在的所有行。因为可以使用4列来识别唯一的行,所以我需要有一种方法来编写WHERE
语句,以确保它正常工作
我的解决方案是连接这4列,并将其用作“一”列/键来进行外部连接:
select *
from table_A
where filter_condition = 0
and (column1 || column2 || column3 || column4) not in (
select A.column1 || A.column2 || A.column3 || A.column4
from table_A A -- 1618727
inner join table_B B
on A.column1 = B.column1
and A.column2 = B.column2
and A.column3 = B.column3
and A.column4 = B.column4
and filter_condition = 0
)
我的问题是,这是一个很好的方法还是我做了一些根本错误的事情
需要明确的是,所需的结果只是返回由于
与表A和表B的内部联接而“丢失”的表A行。您似乎在寻找不存在的:
select a.*
from table_a a
where a.filter_condition = 0
and not exists (
select 1
from table_b b
where
a.column1 = b.column1
and a.column2 = b.column2
and a.column3 = b.column3
and a.column4 = b.column4
)
这将为您提供表a
中的所有记录,这些记录在表b
中没有相应的记录在a
和b
之间使用左连接
,检查b
中的空
行可能更容易:
SELECT *
FROM table_A A
LEFT JOIN table_B B ON A.column1 = B.column1
AND A.column2 = B.column2
AND A.column3 = B.column3
AND A.column4 = B.column4
WHERE B.column1 IS NULL
AND A.filter_condition = 0
您应该能够在PostgreSQL中使用元组(也称为行构造函数):
select *
from table_a
where filter_condition = 0
and (column1, column2, column3, column4) not in
(
select column1, column2, column3, column4
from table_b
);
如果列可以为null,那么最好使用NOT EXISTS
,因为null=null会导致“unknown”,而不是true或false。列筛选条件属于哪个表?涉及的任何null值?请注意'AB'|'C'='A'|'BC'
,但('AB','C')('A','BC')
。这是常见问题解答。在考虑发帖之前,请始终用谷歌搜索你的错误消息或你的问题/问题/目标的许多清晰、简洁和准确的措辞,有/没有你的特定字符串/名称和网站:stackoverflow.com和标签,并阅读许多答案。如果你发布一个问题,用一句话作为标题。请参阅&投票箭头鼠标悬停文本。这可能是最安全和最好的解决方案,因为它返回我要查找的两行(其他行也不多)。将我的问题标记为重复,很抱歉给您带来不便。元组比较正确地处理空值:@a_horse_with_no_name:啊,太好了。谢谢你检查这个。因此,只有当表_b行中的所有这些列都为null时,这才是一个问题。正确,在这种情况下,我们回到了使用null值的旧“无问题”。