gpt4 book ai didi

MYSQL - 如何将2行相关数据合并为1行

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

我是 mysql 的新手并试图研究它但找不到任何解决方案。我有一个这样的表:

    | SW_Pair1        | SW_Pair2        | Pair1_VLAN1| Pair1_VLAN2| Pair2_VLAN1| Pair2_VLAN2| Inter | Mgmt| OSPF| Env | Domain|
|-----------------|-----------------|------------|------------|------------|------------|-------|-----|-----|-----|-------|
| Switch1.abc.com | Switch2.abc.com | VLAN-111 | VLAN-333 | Unknown | Unknown | 47 | 24 | 0.1 | Dev | abc |
| Switch2.abc.com | Switch1.abc.com | VLAN-222 | VLAN-444 | Unknown | Unknown | 47 | 24 | 0.1 | Dev | abc |
| Switch3.abc.com | Switch4.abc.com | VLAN-121 | VLAN-123 | Unknown | Unknown | 47 | 24 | 0.1 | Dev | abc |
| Switch4.abc.com | Switch3.abc.com | VLAN-515 | VLAN-717 | Unknown | Unknown | 47 | 24 | 0.1 | Dev | abc |
| Switch5.abc.com | Switch6.abc.com | VLAN-919 | VLAN-101 | Unknown | Unknown | 47 | 24 | 0.1 | Dev | abc |
| Switch6.abc.com | Switch5.abc.com | VLAN-105 | VLAN-108 | Unknown | Unknown | 47 | 24 | 0.1 | Dev | abc |
| Switch7.abc.com | Switch8.abc.com | VLAN-110 | VLAN-115 | Unknown | Unknown | 47 | 24 | 0.1 | Dev | abc |
| Switch8.abc.com | Switch7.abc.com | VLAN-199 | VLAN-200 | Unknown | Unknown | 47 | 24 | 0.1 | Dev | abc |

以前两行为例。
第 1 行中的 SW_Pair1 == 第 2 行中的 SW_Pair2第 2 行中的 SW_Pair1 == 第 1 行中的 SW_Pair2

我将它们放在下一行,但它们可以在数据库中的任何位置。现在我想合并这两个,以便第 2 行的 Pair1_VLAN1 和 Pair1_VLAN2 中的数据进入第 1 行的 Pair2_VLAN1 和 Pair2_VLAN2,然后第 2 行消失。因此,这是合并后表的外观:

| SW_Pair1        | SW_Pair2        | Pair1_VLAN1| Pair1_VLAN2| Pair2_VLAN1| Pair2_VLAN2| Inter | Mgmt| OSPF| Env | Domain|
|-----------------|-----------------|------------|------------|------------|------------|-------|-----|-----|-----|-------|
| Switch1.abc.com | Switch2.abc.com | VLAN-111 | VLAN-333 | VLAN-222 | VLAN-444 | 47 | 24 | 0.1 | Dev | abc |
| Switch3.abc.com | Switch4.abc.com | VLAN-121 | VLAN-123 | VLAN-515 | VLAN-717 | 47 | 24 | 0.1 | Dev | abc |

等等..

我正在使用 python 2.7 将数据推送到 sql。

编辑:

我尝试在下面的查询中添加对 DELETE 的额外检查,但失败了:

UPDATE yourTable AS a
DELETE FROM yourTable AS b ON a.SW_Pair1 = b.SW_Pair2 AND a.SW_Pair2 = b.SW_Pair1
WHERE Pair2_VLAN1 IS Unknown;

或者更好的是,它可以在将数据移动到交换机 1 后设置第二个交换机的 Pair1_VLAN1 和 Pair1_VLAN2 行的值吗?也许将 vlan 改写为“MERGED”之类的东西。然后,我可以安全地删除 Pair1_VLAN1 和 Pair1_VLAN2 中具有“MERGED”的任何内容。我知道它只会说当它的数据成功移动到另一行时。

编辑 2:

nvm .. 想通了。见下文:

UPDATE yourTable AS a
JOIN yourTable AS b ON a.SW_Pair1 = b.SW_Pair2 AND a.SW_Pair2 = b.SW_Pair1
SET a.Pair2_VLAN1 = b.Pair1_VLAN1,
a.Pair2_VLAN2 = b.Pair1_VLAN2,
b.Pair1_VLAN1 = "MERGED",
b.Pair1_VLAN2 = "MERGED
WHERE a.SW_Pair1 < a.SW_Pair2;

最佳答案

首先用匹配行中的数据更新每对中的第一行:

UPDATE yourTable AS a
JOIN yourTable AS b ON a.SW_Pair1 = b.SW_Pair2 AND a.SW_Pair2 = b.SW_Pair1
SET a.Pair2_VLAN1 = b.Pair1_VLAN1,
a.Pair2_VLAN2 = b.Pair1_VLAN2
WHERE a.SW_Pair1 < a.SW_Pair2;

WHERE 子句确保每对中只有一行(SW_Pair1 中名称较小的那一行)被更新。

然后删除未更新的行。它们在第一个查询更新的列中仍将具有 NULL

DELETE FROM yourTable
WHERE Pair2_VLAN1 IS NULL;

这假设所有内容都有匹配的行。如果您需要更安全的东西,您将需要进行连接以检查是否存在具有相反名称的匹配行。

DELETE a FROM yourTable AS a
JOIN yourTable AS b ON a.SW_Pair1 = b.SW_Pair2 AND a.SW_Pair2 = b.SW_Pair1
WHERE a.Pair2_VLAN1 IS NULL

关于MYSQL - 如何将2行相关数据合并为1行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46717332/

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