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 成功时都已填充——否则,您可以混合使用两个表的属性(例如,Attribute1
和 Attribute2
Table2
和 Attribute3
of Table1
) -- 这可能也是需要的。
我的 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 成功时都已填充——否则,您可以混合使用两个表的属性(例如,Attribute1
和 Attribute2
Table2
和 Attribute3
of Table1
) -- 这可能也是需要的。