我面临着一个设计非常糟糕的数据库,其中包含一个非规范化的表 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 |
但我仍然需要摆脱最后一个寄存器。