我的SQL非常生疏。我认为这是INTERSECT的情况,但我想确定。
我有两张桌子。
表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中的同名列中的字段值。
非常感谢帮助。
答案 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
中的每个字段 - 否则,您可以混合使用两个表的属性(例如,Attribute1
和Attribute2
Table2
的{{1}}和Attribute3
) - 这可能也是您想要的。