我有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
如您所见,只有第二行与自己匹配。
答案 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