验证表的有效方法是另一个表的子集

时间:2019-01-17 22:28:35

标签: sql

我有两个表A和B,结构完全相同。我需要验证A是B的子集。由于结构包含100多个字段,因此我不想在where谓词中逐一列出。

我想知道是否还有更简便的方法

2 个答案:

答案 0 :(得分:4)

假设

(1)AB相同的表结构。这意味着列的顺序及其数据类型必须匹配。

(2)A

中没有重复的行

问题描述

要证明A is a subset of B,您需要显示A\B = empty set

解决方案

这意味着如果删除A中的每一行,并且B中具有匹配行,并且输出为空(0行),则表示A is subset of B

另一方面,如果在输出中获得> 0行,则意味着A包含B没有的行和A isn't a subset of B的行。

SELECT * FROM A
EXCEPT
SELECT * FROM B

A为空(包含0行)时,它将被视为B的子集,因为上述查询的结果将为0行。

答案 1 :(得分:-1)

@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