SQL 与子查询相交或左连接? Disputes/Corrections table

SQL Intersect or Left Join with subquery? Disputes/Corrections table

我的 SQL 可耻地生锈了。我以为这是 INTERSECT 的情况,但我想确定一下。

我有两个table。

Table 1 有一大堆来自提要的行。我们无法控制它们,当提要发送新数据时,对它们值的任何更正都将被撤消。虽然有些数据不正确,因此 Table2 作为争议或更正 table。如果 Table1 中特定行的 Attribue1、Attribute2、Attribute3 字段不正确,则会在 Table2 中为这些字段创建一个具有 "correct" 值的行。我可以通过外键 link 两个 table(我图片中的 MatchKey1)。

我基本上想从 Table1 中获取所有行,但是当它们存在时进行 Table2 更正,就好像它是一个 table 和 "correct" 信息开头。由于 Table2 不会被清除,只要可以在两个 table 之间进行 link,当提要更新 Table1 时,更正将保留。

示例:

Table 1

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

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

Table 2

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

查询将产生:

*{1, 00A1, 绿猫, 快乐}

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

Table 1 中的第 2 行和第 1 行中的 "Happy" (Attribute3) 值一样,但 Attribute1 和 Attribute2 值显示 "corrected" 值。

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

Select * Table1 在 Table1.Matchkey1 = Table2.MatchKey1

上左加入 Table2

不过,我想从 Table1 中的同名列中排除 "incorrect" 字段值。

非常感谢帮助。

您可以使用简单的 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。请注意,此查询假定 Table2 中的每个字段在 JOIN 成功时都已填充——否则,您可以混合使用两个表的属性(例如,Attribute1Attribute2 Table2Attribute3 of Table1) -- 这可能也是需要的。