比较不同视图的值

时间:2016-01-27 12:41:21

标签: sql sql-server sql-server-2008 tsql

我有6个观点,我想比较一下。为了更容易,现在让我们把它带到现在。

视图由3列组成;

Schema_Name varchar(5)
Name varchar(250)
Hash_Value varbinary(max)

我想在这些观点之间比较HashValues

然后我可以简单地INNER JOIN那样

SELECT CH.Name
FROM DB1.dbo.v_TECH_PVChecksums CH
INNER JOIN DB2.dbo.v_TECH_PVChecksums AU
ON AU.HashValue=CH.HashValue 

它将打印来自CH的所有名称,这些名称符合join子句中的要求。 但它并不像我希望的那样工作。问题是,当你在两个视图中都有一些匹配的行时,但是在AU中有一行,它在CH表中没有它的等价物。我的查询不会显示AU表中的这一行。 我尝试了RIGHT OUTER JOIN,但它也显示了AU的所有记录,这些记录都不符合条件。

我想要实现的输出应该是这样的:

CH_Name                         , AU_Name
DQ_1000_RunDQ                   , NULL                          <- they don't match
DQ_1001_SalesNullValues2Weeks   , DQ_1001_SalesNullValues2Weeks <- they match
DQ_1002_SalesDifference2Weeks   , NULL                          <- they dont
NULL                            , SomeRecordWhichIsOnlyInAU     <- this row is only in AU

CH应该是我所比较的某种模式,但尊重上面的情况,当CH中没有记录但是它在AU中

编辑:示例数据 AU:

dbo DQ_1000_RunDQ                   0x5009848AA9BD90CD6C89CE99D3F8142E819279D1
dbo DQ_1001_SalesNullValues2Weeks   0x8838185422EBE35104DC92B24D898D54A97CF2EE
dbo DQ_1002_SalesDifference2Weeks   0xF24E2240DE0F122A47425D1B4D878DAC81ABA596
dbo SomeRecordWhichIsOnlyInAU       0xF24E2240DE0F122A47425D1B4D878DAC81ABA596

CH:

dbo DQ_1000_RunDQ                   0x1A1605A5FF101ED0D6ACFCFC996989D28DC92533
dbo DQ_1001_SalesNullValues2Weeks   0x8838185422EBE35104DC92B24D898D54A97CF2EE
dbo DQ_1002_SalesDifference2Weeks   0x4BCB9B19FDCD5409257A7375ABF907E45C15509B

如您所见,只有第二行与自己匹配。

1 个答案:

答案 0 :(得分:4)

你的问题很不清楚,但根据你想要的输出,你需要完全外连接

SELECT t.name,p.name
FROM DB1.dbo.v_TECH_PVChecksums t
FULL OUTER JOIN DB2.dbo.v_TECH_PVChecksums p
ON t.HashValue=p.HashValue 

编辑后: 如果你想要的是:当它们出现在两者上并且相等时 - &gt;当它们出现在两者上但是哈希不相等时,取两者。当CH出现时,它们只出现在CH上 - 不要当它们出现时只出现在AU上。接受它。

SELECT case when p.name is not null and p.hashvalue <> t.hashvalue then null else t.name end as name1
       , p.name
FROM DB2.dbo.v_TECH_PVChecksums t
LEFT OUTER JOIN DB1.dbo.v_TECH_PVChecksums p
ON t.name=p.name