在有三个组合键来确定记录是否唯一的情况下,我想确定哪些记录在表#1中,而不在表#2中.下面的代码是我得到的最接近的代码,但是WHERE子句需要工作.

在此测试用例中,结果包括:

(2, 3, 2, null)
(4, 4, 1, null)
(7, 2, 2, null)
(8, 1, 2, null)
CREATE TABLE OldReports (
   REPORT_ID int,
   USER_ID int,
   CLIENT_ID int,
   MY_DATA varchar(100)
)

INSERT INTO OldReports
   (REPORT_ID, USER_ID, CLIENT_ID, MY_DATA)
VALUES
   (1, 1, 2, null),
   (6, 3, 3, null),
   (6, 4, 4, null),
   (5, 1, 2, null),
   (5, 1, 3, null),
   (7, 2, 1, null),
   (8, 1, 1, null)

CREATE TABLE NewReports (
   REPORT_ID int,
   USER_ID int,
   CLIENT_ID int,
   MY_DATA varchar(100)
)

INSERT INTO NewReports
   (REPORT_ID, USER_ID, CLIENT_ID, MY_DATA)
VALUES
   (1, 1, 2, null),
   (2, 3, 2, null),
   (4, 4, 1, null),
   (5, 1, 2, null),
   (5, 1, 3, null),
   (7, 2, 2, null),
   (8, 1, 2, null)

DROP TABLE IF EXISTS #ReportDifferences

SELECT DISTINCT
    REPORT_ID,
    USER_ID,
    CLIENT_ID
FROM NewReports n
WHERE (IF NOT EXISTS (
        SELECT * 
        FROM OldReports o 
        WHERE 
            n.REPORT_ID = o.REPORT_ID and
            n.USER_ID = o.USER_ID and
            n.CLIENT_ID = o.CLIENT_ID)
)

-- tell me what lives in NewReports but not in OldReports
SELECT * FROM #ReportDifferences

我try 了这个解决方案(How to select all records from one table that do not exist in another table?),但在 Big Data 集上,结果并不是相互排斥的.类似于:

LEFT JOIN OldReports o ON u.CLIENT_ID = o.CLIENT_ID AND u.REPORT_ID = o.REPORT_ID AND u.USER_ID = o.USER_ID
WHERE
    u.CLIENT_ID is null
    AND u.REPORT_ID is null
    AND u.USER_ID is null

推荐答案

我建议用EXCEPT接线员

select *
from NewReports
except
select *
from OldReports;

或者,如果你说的data指的是多个实际上不为空的列,那么你可以在EXCEPT的结果上连接.

select nr.*
from NewReports nr
join (
    select REPORT_ID, USER_ID, CLIENT_ID
    from NewReports
    except
    select REPORT_ID, USER_ID, CLIENT_ID
    from OldReports
) er on er.REPORT_ID = nr.REPORT_ID
    and er.USER_ID = nr.USER_ID
    and er.CLIENT_ID = nr.CLIENT_ID;

退货

REPORT_ID USER_ID CLIENT_ID MY_DATA
2 3 2 null
4 4 1 null
7 2 2 null
8 1 2 null

https://dbfiddle.uk/tyk4Rlbl

Sql相关问答推荐

用相同值更新行

在SQL中创建一个计数器,根据BigQuery/SQL中的条件递归地添加行值

在甲骨文中查找前一个星期一的S日期

提高写密集型表的查询性能

如何在PostgreSQL中对第1,1,1,1,2,2,2,2行进行编号

重新组合已排序的日期范围

Access中执行INSERT INTO查询时出现错误消息

雅典娜嵌套Json提取液

SQL按日期分组字段和如果日期匹配则求和

将FLOAT转换为VARBINARY,然后再转换回FLOAT

来自按PostgreSQL分组的最小日期

合并分层表SQL中的第一个非空、变化的空位置

使用拆分器将已分组的不同值连接在一起

如何在SQL中从多个查询进行分组

提取连续时间戳范围的SQL

从给定数据中查找下一个工作日期

如何在 SQL Server 中解决这个复杂的窗口查询?

SQL 查询是否返回列表中仅包含某些值而不包含其他值的行?

将表格和字符串连接以 for each 记录生成订单项目

每组跨行曲折?