私は、これらのテーブル間の共通フィールドが正確に一致する行を選択しようとしている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 | +--------+-------+-------+
、に似て何か: "名前を選択し、LOCは、t1からt1.snはt1.sn = t2.snにT2に参加します"。クエリであると思うと、sn値が一致する行が返されます。私の実際のDBには30k行があり、実行と待機を設定すると、最終的にクエリを強制終了する前に結果テーブルに約400k行があります。 – AaplMike
t2.snのユニティシティを確認するには、次のようにしてください:t1.id、count(1)をt1からnbに、内部結合をt2をオンに(t1.sn = t2.sn)、グループをt1.idとして、nb> 1 – Keil
@MikeC :しかし、あなたが得意とする400kの結果は間違っていますか?あなたの質問は、実際にそのクエリのパフォーマンスを向上させる方法についてです(私の最初の答えは、それぞれの 'sn'カラムの両方のテーブルにインデックスがあることを保証するものです)? – eggyal