正規化されていないテーブル 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 |
しかし、私はまだその最後のレジスタを取り除く必要があります.