0

私はテーブルを持っています

--------------------
ID | Name | RollNO
--------------------
1  | A    | 18
--------------------
2  | B    | 19RMK2
--------------------
3  | C    | 20
--------------------

私の2番目のテーブルは

-----------------------
OldRollNo | NewRollNo
-----------------------
18        |  18RMK1
-----------------------
19        |  19RMK2
-----------------------
20        |  20RMK3
-----------------------
21        |  21RMK4
-----------------------
22        |  22RMK5
-----------------------

結果のテーブルが欲しい

----------------------------------
ID | Name | RollNo | LatestRollNo
----------------------------------
1  | A    | 18     | 18RMK1
----------------------------------
2  | B    | 19RMK2 | 19RMK2
----------------------------------
3  | C    | 20     | 20RMK3
----------------------------------

選択クエリはどのようなものでしょうか? これは私の問題の単なるレプリカです。選択クエリで CASE ステートメントを使用しましたが、テーブル内のレコードが大きいため、時間がかかりすぎています。私の 2 番目のテーブルでは、OldRollNo 列は一意です。もう 1 つのことは、結果の RollNo 列で、新しく割り当てられた RollNo が既に存在する場合、次の列、つまり LatestRollNo に正確にコピーする必要があることです。古い RollNo だけをチェックする必要があります。ありがとう。

4

4 に答える 4

1

次のようなことを試してください:

select t1.ID
  , t1.Name
  , t1.RollNO
  , LatestRollNO = coalesce(n.NewRollNo, o.NewRollNo)
from t1
  left join t2 o on t1.RollNO = o.OldRollNo
  left join t2 n on t1.RollNO = n.NewRollNo

demo を使用した SQL Fiddle

あなたの問題はロジックではなくパフォーマンスのようです。t2.OldRollNoこのようなものは、 と に適切なインデックスがあると仮定して、適切なインデックスの使用を許可するはずですt2.NewRollNo

句の問題はOR、これらが常に効率的なクエリに役立つとは限らないことです。うまくいけば、これはあなたのケースでもう少し役立つでしょう。CASEWHERE

于 2013-07-17T10:10:01.600 に答える
1
select f.ID, f.name, f.RollNo, s.NewRollNo as "Latest RollNo"
from FirstTable f 
inner join 
SecondTable s on f.RollNo = s.OldRollNo or f.RollNo = s.NewRollNo
于 2013-07-17T10:01:20.420 に答える