SQL Intersect或Left Join with subquery?争议/更正表

时间:2015-03-21 20:10:26

标签: sql join intersect

我的SQL非常生疏。我认为这是INTERSECT的情况,但我想确定。

我有两张桌子。enter image description here

表1中有一大堆来自Feed的行。我们无法控制它们,并且当Feed发送新数据时,对其值的任何更正都将被撤消。但有些数据并不正确,因此Table2充当争议或更正表。如果Table1中特定行的Attribue1,Attribute2,Attribute3字段不正确,则在表2中创建一行,其中"正确"这些字段的值。我可以通过外键(我的图片中的MatchKey1)链接这两个表。

我基本上想要获取Table1中的所有行,但是当它们存在时使用Table2更正,就好像它是一个带有"正确"的表。信息开头。由于Table2没有被删除,只要在两个表之间建立链接,当Feed更新Table1时,更正将保留。

示例:

表1

*第1行:{1,00A1,黄色,鱼,快乐}

第2行:{2,00A2,红色,牛,悲伤} *

表2

第1行:{00A1,绿色,猫,快乐}

查询会生成:

* {1,00A1,Green,Cat,Happy}

{2,00A2,Red,Cow,Sad} *

表1中的第2行仍然存在," Happy" Row1中的(Attribute3)值,但Attribute1和Attribute2值显示"更正"值。

如果不是INTERSECT,某种左连接(可能带有子查询)会更好吗?

在Table1.Matchkey1 = Table2.MatchKey1

上选择* Table1左连接表2

我想排除"错误"表1中的同名列中的字段值。

非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用简单的COALESCE语句和LEFT JOIN(oracle或db2中的示例)来处理这种情况:

SELECT Table1.PrimaryKeyID
     , Table1.MatchKey1
     , COALESCE(Table2.Attribute1, Table1.Attribute1) AS Attribute1
     -- and so on
FROM Table1
LEFT JOIN
Table2
ON Table2.MatchKey1=Table1.MatchKey1

如果您的方言中没有COALESCE,请改用CASE WHEN ... IS NULL THEN ... ELSE ... END。请注意,此查询假定在JOIN成功时填充Table2中的每个字段 - 否则,您可以混合使用两个表的属性(例如,Attribute1Attribute2 Table2的{​​{1}}和Attribute3) - 这可能也是您想要的。