2012-05-08 6 views
0

私は、これらのテーブル間の共通フィールドが正確に一致する行を選択しようとしている2つのテーブルを持っていますが、クエリを書くことは困難です。ここでは単純化されたバージョンは次のとおりです。小さなソリューションセットのために巨大な結果テーブルを生成するMysql join

表は、この(簡体字)のように見える:私は一緒にのみ、どこt1.sn = t2.sn t1.nameとt2.locを取得しようとしている

 
T1: 
    id, name, sn 

T2: 
    id, location, sn 

。 snフィールドは両方で一意であるため、最大で1つのレコードだけがテーブル間で一致します。 t1では、すべてのレコードにsnフィールド値がありますが、t2では約30%がsnに対してNULLを持っています。だから、私はt1よりも幾分少ない行を生成する結合を期待しています。

どうすれば参加できますか?

ありがとうございました。

サンプルデータ:上記のこの例では

 
t1: 
+---+--------+-------+-----+ 
| id| name | sn | ... | 
+---+--------+-------+-----+ 
| 1 | thing1 | 12345 |  | 
| 2 | thing2 | 10000 |  | 
| 3 | thing3 | 33445 |  | 
| 4 | thing4 | 99223 |  | 
+---+--------+-------+-----+ 

T2: 
+----+--------+-------+-----+ 
| id | loc | sn | ... | 
+----+--------+-------+-----+ 
| 90 | here | 12345 |  | 
| 92 | there | NULL |  | 
| 96 | near | 33445 |  | 
| 99 | far | 99223 |  | 
+----+--------+-------+-----+ 

Result: 
+--------+-------+-------+ 
| name | loc | sn | 
+--------+-------+-------+ 
| thing1 | here | 12345 | 
| thing3 | near | 33445 | 
| thing4 | far | 99223 | 
+--------+-------+-------+ 
+0

、に似て何か: "名前を選択し、LOCは、t1からt1.snはt1.sn = t2.snにT2に参加します"。クエリであると思うと、sn値が一致する行が返されます。私の実際のDBには30k行があり、実行と待機を設定すると、最終的にクエリを強制終了する前に結果テーブルに約400k行があります。 – AaplMike

+0

t2.snのユニティシティを確認するには、次のようにしてください:t1.id、count(1)をt1からnbに、内部結合をt2をオンに(t1.sn = t2.sn)、グループをt1.idとして、nb> 1 – Keil

+0

@MikeC :しかし、あなたが得意とする400kの結果は間違っていますか?あなたの質問は、実際にそのクエリのパフォーマンスを向上させる方法についてです(私の最初の答えは、それぞれの 'sn'カラムの両方のテーブルにインデックスがあることを保証するものです)? – eggyal

答えて

1
SELECT 
    t1.name AS name, 
    t2.loc AS loc, 
    t1.sn AS sn 
FROM t1 
INNER JOIN t2 ON t1.sn=t2.sn 
+0

プロダクションDBの構造とサンプルの構造が異なることを明確にしています。 'INNER JOIN'だけが最小の結合テーブルよりも多くのレコードを与えることはできません(joinfieldsがunqueの場合) –

+0

あなたの答え、Eugenに感謝します。それは多くを説明し、私が提供したデータを振り返ると、最初の前提が正しくないことがわかりました。 t2に重複するsnがあります。これは、返された値が一意であることを超えてしまう原因となります。あなたの貢献に感謝します。 – AaplMike

関連する問題