繁体   English   中英

SQL 查询查找两个相关表之间的缺失行

[英]SQL Query to find missing rows between two related tables

我有两张桌子:

表 A

  • ID
  • ABC_ID
  • 价值

表 B

  • ID
  • ABC_ID
  • 价值

这两个表通过ABC_ID列直接相互关联。

我想在表 A 中找到所有VAL列值,这些值在表 B 中存在于相同的 ABC_ID。

SELECT A.ABC_ID, A.VAL FROM A WHERE NOT EXISTS 
   (SELECT * FROM B WHERE B.ABC_ID = A.ABC_ID AND B.VAL = A.VAL)

SELECT A.ABC_ID, A.VAL FROM A WHERE VAL NOT IN 
    (SELECT VAL FROM B WHERE B.ABC_ID = A.ABC_ID)

SELECT A.ABC_ID, A.VAL LEFT OUTER JOIN B 
    ON A.ABC_ID = B.ABC_ID AND A.VAL = B.VAL FROM A WHERE B.VAL IS NULL

请注意,这些查询根本不需要表 B 中的 ABC_ID。 我认为这就是你想要的。

另一种基于JOIN的解决方案。
Join 使用链接(请求的ON部分)组合表 A 和表 B 中的内容。

SELECT
    *
FROM
    A
INNER JOIN
    B
ON
    B.ABC_ID = A.ABC_ID
WHERE
    B.VAL <> A.VAL

基本上,我们在 ABC_ID 上将表 A 与表 B 组合在一起,然后检查 A.VAL 不等于 B.VAL 的位置。 使用INNER JOIN连接的数据仅包含表 A 和 B 都存在 ABC_ID () 的记录。

DECLARE @start_date DATETIME='04-01-2021'; DECLARE @End_date DATETIME='04-30-2021'; 声明 @min int 声明 @max int select @min =min(test_uid), @max =max(test_uid) from test where DATE >= @START_DATE AND DATE < DATEADD(DAY, 1, @END_DATE)

select test_UID+1 as FirstMissingId, nextid - 1 as LastMissingId into #tmp from (select test.*,lead(test_UID) over (order by test_UID) as nextid from test where test_UID between @min and @max ) test where nextid <> test_UID+1 CREATE TABLE #tmp1 (ID INT) 去
声明 @lastmissingid BIGINT , @firstmissingid BIGINT 声明 recscan 游标选择 firstmissingid ,lastmissingid from #tmp open recscan fetch next from recscan 到 @firstmissingid ,@lastmissingid while @@FETCH_STATUS = 0 begin declare @maxcnt int = @lastmissingid
声明@mincnt, int =@firstmissingid

同时@Counter <= @maxcnt
BEGIN INSERT #tmp1 values(@Counter) SET @Counter += 1 END 从recscan 取下一个到@firstmissingid ,@lastmissingid end close recscan 解除分配recscan

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM