您好:)我对使用INNER JOIN还是比较陌生,但仍然尝试理解它的逻辑,我认为我已经开始理解它了。在涉及该主题的几篇不同文章之后,我生成了一个查询,用于在电话号码表中查找重复项。
我的表结构是这样的:
+---------+-------+
| PhoneID | Phone |
+---------+-------+
非常简单。我创建了此查询:
SELECT A.PhoneID, B.PhoneID FROM T_Phone A
INNER JOIN T_Phone B
ON A.Phone = B.Phone AND A.PhoneID < B.PhoneID
返回与另一部电话匹配的电话的ID。我不知道该如何正确地表达,因此这是示例输出:
+---------+---------+
| PhoneID | PhoneID |
+---------+---------+
| 17919 | 17969 |
| 17919 | 22206 |
| 17919 | 23837 |
| 17920 | 17970 |
| 17920 | 22203 |
| 17920 | 23834 |
| 17921 | 17971 |
| 17921 | 22225 |
| 17921 | 22465 |
| 17921 | 24011 |
| 17921 | 24047 |
| 17922 | 17972 |
| 17922 | 22198 |
| 17922 | 23879 |
| 17923 | 17973 |
| 17923 | 22199 |
| 17923 | 23880 |
+---------+---------+
您可以注意到,在左侧有重复的ID,与之匹配的电话号码将在右侧(这些只是这些号码的ID)。我要完成的工作实际上是相对于右侧的ID更改连接表。联接表结构如下:
+----------+-----------+
| T_JoinID | T_PhoneID |
+----------+-----------+
其中T_JoinID是一个较大的对象,具有这些T_PhoneID的集合,因此是联接表。我想做的是从原始匹配查询中获取一行,并在联接表中找到右侧的PhoneID,然后将联接中的该项更新为与左侧的PhoneID相等。对每一行重复一次。
这是一种节省空间并消除匹配数字的方法,我可以将匹配的数字指向原始数字,并在需要检索时将其用作参考。
此后,我实际上需要删除重置参考的原始编号,但是...这似乎是一项针对2或3个不同查询的工作。
编辑: 抱歉,我没有提供足够的细节。这是一些其他信息: 我的确切表结构与此处不同,但是我仅使用列出的列,因此我不认为其他任何一个都会影响这一事实。大多数表都有一个自动递增的唯一ID。电话表中包含运营商,类型和列。我觉得不需要添加其他列,但是如果有一个包含每个表的自动递增ID的解决方案,请让我知道:)无论如何,尽管仍然有兴趣学习,但我还是使用多个查询找到了解决方案并根据此问题应用知识。所以我有一个提到的连接表。预期结果可能看起来像这样。遗憾的是,有一张前后的桌子,格式不好。
+--------------------+---------+----------+---------+
| Join Table Results | | | |
+--------------------+---------+----------+---------+
| Before | | After | |
| Join | Table | Join | Table |
| PersonID | PhoneID | PersonID | PhoneID |
| 1 | 1 | 1 | 1 |
| 1 | 2 | 1 | 2 |
| 1 | 3 | 1 | 3 |
| 2 | 4 | 2 | 1 |
| 2 | 5 | 2 | 5 |
| 2 | 6 | 2 | 6 |
| 3 | 7 | 3 | 5 |
| 3 | 8 | 3 | 5 |
| 3 | 9 | 3 | 5 |
| 3 | 10 | 3 | 8 |
| 3 | 11 | 3 | 9 |
+--------------------+---------+----------+---------+
因此,您可以看到在之前的列中,我最初发布的PhoneID-PhoneID关系表中的7、8和9都是重复的电话号码。查询后,我想使用PhoneID-PhoneID比较来检索重复项,并进行匹配,以上面直接显示的方式更改联接表。所以7、8、9都变成了5。因为5是原始数字,而7、8、9恰好是5的重复,所以我基本上将所有这些都指向5,然后删除原本是7的数字。我的电话表中的8、9都与5有新关系。这有意义吗? xD听起来很难听。
结束编辑
如何改善查询以完成此任务?是否可以使用UPDATE语句?我也在考虑仅循环浏览此输出并单独更新每一行,但我希望仅使用一个查询来节省时间和代码。键入它会使我感到有点讨厌,但我希望那里有解决方案!
预先感谢任何人抽出宝贵时间来帮助我:)非常感谢。如果听起来很古怪,请告诉我,我将只使用多个查询。