我有两个表A和B,结构完全相同。我需要验证A是B的一个子集。因为结构包含100多个字段,我不想在where谓词中逐个列出它们。
我想知道是否有更简单的方法来做到这一点
我有两个表A和B,结构完全相同。我需要验证A是B的一个子集。因为结构包含100多个字段,我不想在where谓词中逐个列出它们。
我想知道是否有更简单的方法来做到这一点
假设:
(1) A
和B
具有相同的表结构。这意味着列的顺序和数据类型必须匹配。
(2) 表A
中没有重复行。
问题描述
为了证明A是B的子集
,您需要显示A\B = 空集
。
解决方案
这意味着如果您删除每个在B
中与A
匹配的行,且输出为空(0行),则意味着A是B的子集
。
另一方面,如果输出中有> 0
行,则意味着A
具有B
中没有的行,因此A不是B的子集
。
SELECT * FROM A
EXCEPT
SELECT * FROM B
A
为空(包含 0 行)时,它将被视为 B
的子集,因为上述查询的结果将为 0 行。ROW_NUMBER() OVER (PARTITION BY a, b, c ORDER BY NULL) AS differentiator
(或类似语句),然后应用 EXCEPT 方法。 - MatBailie@robertoplancarte的方法稍加调整
with tB_cnt as
(
SELECT COUNT(*) cnt FROM
(
SELECT DISTINCT * FROM dbo.T_B
) T_B
), TAB_cnt as
(
SELECT count(*) cnt FROM
(
SELECT * FROM dto.T_B
UNION
SELECT * FROM dto.T_A
) T_AB
)
SELECT
CASE WHEN TB_CNT.CNT = TAB_CNT.CNT THEN
'Table A is subset of B'
else
'Table A is not subset of B'
END as Result
FROM TAB_CNT, TB_CNT