我面临着一个设计非常糟糕的数据库,其中有一个非规范化的表 X。
该表 X 应该与另一个表 Y 具有 N:M 关系。
问题在于,这种关系目前是 1:N,而到目前为止,偷工减料的解决方案是在有多个注册表需要关联时复制条目。
简化一下,我有这个:
| ID | TEXT | LOCATION_ID |
| 1 | foo | 1 |
| 2 | foo | 2 |
| 3 | bar | 1 |
| 4 | bar | 4 |
| 5 | bar | 3 |
我必须规范化这张表。因此,我的第一个想法是尝试获取成对的相似注册表。像这样的事情:
| a.ID | b.ID |
| 1 | 2 |
| 3 | 4 |
| 3 | 5 |
尝试一下:
SELECT a.id, b.id
FROM mytable AS a
INNER JOIN mytable AS b
ON a.text = b.text AND a.id != b.id
GROUP BY a.id, b.id
这会导致这样的问题:
| a.ID | b.ID |
| 1 | 2 |
| 2 | 1 |
| 3 | 4 |
| 3 | 5 |
| 4 | 3 |
| 4 | 5 |
| 5 | 3 |
| 5 | 4 |
这些对是重复的。
经过一番挖掘,我意识到这更有效:
SELECT a.id, b.id
FROM mytable AS a
INNER JOIN mytable AS b
ON a.text = b.text AND a.id < b.id
GROUP BY a.id, b.id
所以,我得到了这个:
| a.ID | b.ID |
| 1 | 2 |
| 3 | 4 |
| 3 | 5 |
| 4 | 5 |
但我仍然需要摆脱最后一个寄存器。