Sql 比较两个表以查找丢失的记录
如果表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中。请尝试此操作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
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