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 に答える