Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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_Sql Server 2008 - Fatal编程技术网

Sql 比较两个表以查找丢失的记录

Sql 比较两个表以查找丢失的记录,sql,sql-server-2008,Sql,Sql Server 2008,如果表B中的所有记录都存在于表A中,并且当其中任何一条记录丢失时,如何比较两个表中是否有丢失的记录,并将状态设置为“是”?。比如说, 表A 800001001 8000011001 8000025001 80000250000 表B 8000010 800001001 800001002 8000011 8000011001 8000012 8000012001 8000023 8000023001 8000025 8000025001 80000250000 8000026 800002601

如果表B中的所有记录都存在于表A中,并且当其中任何一条记录丢失时,如何比较两个表中是否有丢失的记录,并将状态设置为“是”?。比如说,

表A

800001001

8000011001

8000025001

80000250000

表B

8000010

800001001

800001002

8000011

8000011001

8000012

8000012001

8000023

8000023001

8000025

8000025001

80000250000

8000026

800002601

800002602

输出

8000010号

800011是的

8000012号

8000023号

8000025是的

8000026号

注意-请检查表B,您可以找到记录之间的父级和子级关系。例如800010800001800010002。父记录8000108000118000012。。。没有出现在表A中。

请尝试此操作

declare @tableA table(id varchar(10))
insert into @tableA values('800010001')
insert into @tableA values('8000011001')
insert into @tableA values('8000025001')
insert into @tableA values('8000025002')

declare @tableB table (id varchar(10))
insert into @tableB values('8000010')
insert into @tableB values('8000010001')
insert into @tableB values('8000010002')
insert into @tableB values('8000011')
insert into @tableB values('8000011001')
insert into @tableB values('8000012')
insert into @tableB values('8000012001')
insert into @tableB values('8000023')
insert into @tableB values('8000023001')
insert into @tableB values('8000025')
insert into @tableB values('8000025001')
insert into @tableB values('000025002')
insert into @tableB values('8000026')
insert into @tableB values('8000026001')
insert into @tableB values('8000026002')
使用左连接可以解决此问题。但最好的方法是通过一个唯一的id映射这两个表

//表A与表B的比较

select a.id, case when b.id IS null then 'No' else 'Yes' end as Status from @tableA a left join @tableB b on a.id = b.id
//表B与表A的比较

select b.id, case when a.id IS null then 'No' else 'Yes' end as Status from @tableB b left join @tableA a on a.id = b.id

我们需要先拆分记录以建立父子关系

第一个CTE进行此拆分,最好将您的表更改为此格式,而不是像现在这样的单个ID

ID          parent
8000010     NULL
8000010001  8000010
8000010002  8000010
第二个CTE确实与TableA连接以查找匹配的记录 最后,实际的子计数与第二次CTE的结果相匹配,将其标记为否或是

; WITH cte
as
(
SELECT ID, 
       case when Id/10000000 >0 
             then ID/1000
             else NULL
             end as parent
FROM TableB
)
, cte1
as
(
SELECT cte.parent, count(cte.id) as matchedChildrenCount
FROM cte
JOIN tableA A
ON cte.id = A.id

WHERE cte.parent is not null
GROUP BY parent 
)

SELECT T.parent, CASE WHEN cte1.parent is null or T.childrenCount <> cte1.matchedChildrenCount
                      THEN 'No' else 'Yes' 
                      END as value from 
(select parent, 
        COUNT(cte.id) as childrenCount   
 FROM cte 
 where cte.parent is not null
 group by parent 
 ) T
 left join cte1
 on cte1.parent = T.parent