2

2 つのテーブルがあり、1 つには ID <-> 名前マッピングが含まれ、もう 1 つのテーブルには複数の ID 列が含まれています。対応する ID の名前を持つ 2 番目のテーブルのレコードを一覧表示するには、次のようなクエリを実行します。

SELECT 
 (SELECT NAME FROM TAB2 WHERE ID = ID1 ),
 (SELECT NAME FROM TAB2 WHERE ID = ID2),
 .
 .
 .
FROM TAB1

これがそれを行う唯一の方法でしょうか?2 番目のテーブルは、すべての行のすべての ID 列に対してクエリが実行されるためです。

4

2 に答える 2

2

このアプローチを試すことができます:

select t1.*
from Table1 t1
join Table2 t2 on t1.id=t2.id1 OR t1.id=t2.id2 OR t1.id=t2.id3

いずれかの ID が の ID と一致Table1する の行が存在する の各行が返されます。Table2Table1

于 2012-07-03T09:27:39.210 に答える
0

オプションとして、次のようにクエリを書き直してみることができます。

SELECT 
 b1.NAME,
 b2.NAME,
 .
 .
 .
FROM TAB1 a
INNER JOIN TAB2 b1 ON a.ID1 = b1.ID
INNER JOIN TAB2 b2 ON a.ID1 = b1.ID
...

効率に関してはほとんど違いはありませんが、少なくともクエリが読みやすくなる可能性があります (もちろん主観的です)。

考慮すべき別のオプションがあるかもしれませんが、よくわからない 2 つの大きな IF があります。

最初のものは、 のキーの存在に依存しますTAB1。専用のキー列がない場合は、すべての組み合わせが一意であることが保証されていれば十分です。このアプローチが複数のルックアップよりも効率的であるかどうかは、列の数によって異なります。(ID1, IF2, ... IDN)IDx

アイデアは、 @dasblinkenlight の回答と同様の条件で 2 つのテーブルを一度だけ結合し、キー列でグループ化し、条件付き集計を使用して名前を取得することです。これが私が意味することです:

SELECT
  MAX(CASE TAB2.ID WHEN TAB1.ID1 THEN TAB2.NAME END) AS NAME1,
  MAX(CASE TAB2.ID WHEN TAB1.ID2 THEN TAB2.NAME END) AS NAME2,
  .
  .
  .
FROM TAB1
INNER JOIN TAB2 ON TAB2.ID IN (TAB1.ID1, TAB1.ID2, ...)
GROUP BY TAB1.ID1, TAB1.ID2, ...
于 2012-07-03T19:29:56.767 に答える