Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于多个键/列的反联接(SQL)_Sql_Postgresql_Join - Fatal编程技术网

基于多个键/列的反联接(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值的旧“无问题”。