5

我面临着一个设计非常糟糕的数据库,其中包含一个非规范化的表 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   |

但我仍然需要摆脱最后一个寄存器。

4

1 回答 1

10

仅在一侧分组并在另一侧进行分组MIN()

SELECT   MIN(a.ID) a, b.ID b
FROM     mytable a JOIN mytable b ON b.text = a.text AND b.ID > a.ID
GROUP BY b.ID

sqlfiddle上查看。

于 2013-07-13T17:17:19.383 回答