gpt4 book ai didi

mysql - 形成一个查询来获取具有公共(public)列的两个表中的差异

转载 作者:行者123 更新时间:2023-11-29 18:09:34 24 4
gpt4 key购买 nike

我有两个表。一个包含原始数据(t1),另一个包含执行某些操作后更改的数据(t2)。两个表的结构相同(列 - GUID、ID、值)。 GUID、ID构成主键。

操作后GUID和ID将保持不变。然而,一些ID(在t1中)在t2中可能不存在,并且一些ID可能在t2中添加。 示例 -

             t1                              t2
GUID ID Value GUID ID Value
(i) 1 a x 1 a x --> same
(ii) 1 b y 1 b w --> VALUE different
(iii) 2 a x --> extra ID in t1
(iv) 2 b z --> extra ID in t2

我的目标是以以下格式打印 t1 和 t2 的差异(新表)

                   Difference
GUID ID Value1 Value2
(ii) 1 b y w --> VALUE different
(iii) 2 a x NULL --> extra ID in t1
(iv) 2 b NULL z --> extra ID in t2

我的尝试 -

我把问题分成了三部分。

  1. 插入值不同的行

    INSERT INTO Difference(GUID,ID,Value1,Value2)
    SELECT t1.GUID, t1.ID, t1.Value, t2.Value from t1, t2
    WHERE t1.GUID = t2.GUID and t1.ID = t2.ID and t1.Value != t2.Value

    上述查询返回正确的值。

  2. 插入 ID 存在于 t1 中但不存在于 t2 中的行。我想使用这样的查询 ->

    INSERT INTO Difference(GUID,ID,Value1)
    (SELECT t1.GUID, t1.ID, t1.Value from t1, t2
    WHERE t1.GUID= t2.GUID and t1.ID IN
    ((SELECT GUID,ID FROM t1 ) EXCEPT
    (SELECT GUID,ID FROM t2 ))) // I get an error here.

    错误:- 当子查询没有使用 EXISTS 引入时,选择列表中只能指定一个表达式。

    我知道我应该只为 IN 子句选择“ID”列。但这不满足条件。我想在“IN”子句中使用 GUID 和 ID。我尝试了一些其他的查询,但没有成功。我应该怎样做才能得到这个结果?

  3. 与第二个相同,但表格相反。

最佳答案

您可以将 t1 连接 t2 和 t2 连接 t1 联合起来,并按两列键进行分组,以仅允许来自其交集的一条记录

SELECT 
x.GUID,
x.ID,
x.Value1,
x.Value2
FROM (
SELECT t1.GUID, t1.ID, t1.Value AS Value1, t2.Value AS Value2 FROM t1 LEFT JOIN t2 ON t2.GUID = t1.GUID AND t2.ID = t1.ID
UNION ALL
SELECT t2.GUID, t2.ID, t1.Value AS Value1, t2.Value AS Value2 FROM t2 LEFT JOIN t1 ON t1.GUID = t2.GUID AND t1.ID = t2.ID
) x
GROUP BY x.GUID, x.ID;

关于mysql - 形成一个查询来获取具有公共(public)列的两个表中的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47509397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com