我是 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/