[英]SQL: Comparing two tables for missing records and then on the date fields
[英]Comparing two tables for missing records
如何比较两个表丢失记录和状态设置为Yes,如果存在于表-A 表-B的所有记录和NO当记录中的任何一个缺失? 举例来说,
表A
8000010001
8000011001
8000025001
8000025002
表B
8000010
8000010001
8000010002
8000011
8000011001
8000012
8000012001
8000023
8000023001
8000025
8000025001
8000025002
8000026
8000026001
8000026002
产量
8000010不
8000011是
8000012否
8000023不
8000025是
8000026没有
注意 -请检查表B ,您可以在记录之间找到父子关系。 例如8000010、8000010 001、8000010002。父记录(8000010、8000011、8000012 ...)未出现在表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映射两个表。
//比较tableA和tableB
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
//将tableB与tableA比较
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进行JOIN
查找匹配记录最后,将实际的子计数与第二个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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.