0

同じテーブル内の他のエントリを参照する 3 つの識別子と共に Name 列を持つテーブルがあります。これら 3 つの識別子を参照しているレコードの実際の名前に解決するクエリです。これまでのところ、私は次のことしか管理していません...

SELECT mt.Name, mt2.Name, mt3.Name, mt4.Name 
FROM MyTable AS mt1
LEFT OUTER JOIN MyTable AS mt2 ON mt2.Id = mt1.RefId1
LEFT OUTER JOIN MyTable AS mt3 ON mt3.Id = mt1.RefId2
LEFT OUTER JOIN MyTable AS mt4 ON mt4.Id = mt1.RefId3

...これは機能し、実際に 3 つの参照レコードの名前を返します。場合によっては、RefId1/2/3 の値が空になることがあるため、すべての RefId フィールドが常に使用されるわけではないことに注意してください。それは機能しますが、正確には高速ではありません.SQLを実際に知っている人なら、これを大幅に改善できると確信しています. 何か案は?

4

2 に答える 2

1

クエリを改善するには、LEFT OUTER JOIN の代わりに INNER JOIN を使用できます。あなたのコメントを正しく理解できれば、mt2、mt3、mt4 のいずれかが値を返します。

したがって、有効なクエリは次のように記述できます。これにより、一致が見つかるとすぐに先読みを停止します。

SELECT mt.Name, mt2.Name
FROM MyTable mt, MyTable mt2
WHERE mt2.id = mt.RefId1
OR mt2.id = mt.RefId2
OR mt2.id = mt.RefId3

これがうまくいくかどうか教えてください。

于 2013-01-30T05:44:54.883 に答える
0

テーブルのインデックスを作成してみましたか?

于 2013-01-30T06:22:38.503 に答える