比较两个表并添加一列

时间:2014-05-06 20:00:18

标签: sql sql-server sql-server-2008-r2

我有一个关系数据库,我想比较两个条目的数据差异。每个条目可能只是略有不同,但两个条目之间可能有大约100,000行要比较。

我将所有要比较的数据从两个数据库条目放入两个单独的临时表中,这些表排除了所有设置为唯一值的主键和外键(因此,它们总是不同的... 。并返回结果)。

我现在的做法是:

    Select PrimaryStream, SecondaryStream, FirstFrame
    From #tempTable1
    UNION
    Select PrimaryStream, SecondaryStream, FirstFrame
    From #tempTable2
    EXCEPT
    Select PrimaryStream, SecondaryStream, FirstFrame
    From #tempTable1
    INTERSECT
    Select PrimaryStream, SecondaryStream, FirstFrame
    From #tempTable2

我得到了我想要的差异的结果,但我也想在这些结果中添加“PrimaryStreamName”,这是#tempTable1和#tempTable2,但是我不能用它们进行比较,因为它们总会与众不同。

#tempTable1中的每个PrimaryStreamName都相同,#tempTable2中的每个PrimaryStreamName都相同,但#tempTable1.PrimaryStreamName!=#tempTable2.PrimaryStreamName。

所以,我的目标是将PrimaryStreamName添加到结果中。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

请检查效果,但是以下查询应该给出预期结果:

Select PrimaryStream, SecondaryStream, FirstFrame, '1' PrimaryStreamName
From #tempTable1
UNION ALL
Select PrimaryStream, SecondaryStream, FirstFrame, '2' PrimaryStreamName
From #tempTable2    
EXCEPT
( 
    (
        Select PrimaryStream, SecondaryStream, FirstFrame, '1' PrimaryStreamName
        From #tempTable1
        INTERSECT
        Select PrimaryStream, SecondaryStream, FirstFrame, '1' PrimaryStreamName
        From #tempTable2    
    )
    UNION ALL
    (
        Select PrimaryStream, SecondaryStream, FirstFrame, '2' PrimaryStreamName
        From #tempTable1
        INTERSECT
        Select PrimaryStream, SecondaryStream, FirstFrame, '2' PrimaryStreamName
        From #tempTable2
    )
)

注意,有一个技巧:我执行INTERSECT两次(我使用UNION ALL,因为它比UNION更快),因此查询在某些操作期间对更多行进行操作