如何检查不同表中两列的内容是否相同?

我的SQL数据库中有两个表。我想检查Specifier列是否具有完全相同的顺序完全相同的数据。

确定情况,因为两个表在Specifier列中具有相同顺序的相同数据:

-- Table1:
RowID   Specifier
187     1         
188     1         
189     2         

-- Table2:
RowID   Specifier
181     1         
182     1         
183     2       

错误情况,因为数据不同:

-- Table1:
RowID   Specifier
187     1         
188     2         
189     3         

-- Table2:
RowID   Specifier
181     1         
182     2         
183     2    

错误情况,因为数据的顺序不同:

-- Table1:
RowID   Specifier
187     1         
188     1         
189     2         

-- Table2:
RowID   Specifier
181     1         
182     2         
183     1   

错误情况,因为数据量不同:

-- Table1:
RowID   Specifier
187     1         
188     1         
189     2         

-- Table2:
RowID   Specifier
181     1         
182     1         
183     2
184     1       

我编写了以下查询,该查询几乎可以正常工作,并且如果一个表具有另一个表没有的值,则会正确给出错误,但是如果仅顺序不正确,它将错误地不给出错误:

IF EXISTS
    (SELECT Specifier FROM Table1 EXCEPT SELECT Specifier FROM Table2
    UNION ALL
    SELECT Specifier FROM Table2 EXCEPT SELECT Specifier FROM Table1)
BEGIN
    THROW 99999,'Mismatching Specifiers between the two tables',1;
END;
xbl_lkz 回答:如何检查不同表中两列的内容是否相同?

您可以使用full joinrow_number()。以下是例外情况:

select *
from (select t1.*,row_number() over (order by rowid) as seqnum
      from table1 t1
     ) t1 full join
     (select t2.*,row_number() over (order by rowid) as seqnum
      from table2 t2
     ) t2
     on t1.seqnum = t2.seqnum and t1.specifier = t2.specifier
where t1.seqnum is null or t2.seqnum is null;

如果您只想要一个标志:

select (case when count(*) > 1 then 1 else 0 end)
from (select t1.*,row_number() over (order by rowid) as seqnum
      from table2 t2
     ) t2
     on t1.seqnum = t2.seqnum and t1.specifier = t2.specifier
where t1.seqnum is null or t2.seqnum is null;

如果您关心性能,则将第一个查询与exists一起使用应该会更快。

,

似乎使用它可能会更容易

IF EXISTS (SELECT 1
           FROM (SELECT ROW_NUMBER() OVER (ORDER BY RowID) AS RN,Specifier
                 FROM Table1) T1
                FULL OUTER JOIN (SELECT ROW_NUMBER() OVER (ORDER BY RowID) AS RN,Specifier
                                 FROM Table2) T2 ON T1.RN = T2.RN
                                                AND T1.Specifier = T2.Specifier
           HAVING COUNT(CASE WHEN T1.RN IS NULL OR T2.RN IS NULL THEN 1 END) >= 1) ...
本文链接:https://www.f2er.com/3136877.html

大家都在问