SQL: UNIONでは暗黙のソート処理あり
少し前の事ですが、同じ構造のテーブルを合成する機会がありました。
環境はSQLServer2008R2のT-SQL。
よくよく考えれば大した事じゃないのですが、備忘録を兼ねて書いておきます。
DECLARE @tbl_temp1 table (
code NUMERIC(2)
, name VARCHAR(20)
);
INSERT INTO @tbl_temp1 VALUES (1, 'テーブル1の1');
INSERT INTO @tbl_temp1 VALUES (2, 'テーブル1の2');
INSERT INTO @tbl_temp1 VALUES (3, 'テーブル1の3');DECLARE @tbl_temp2 table (
code NUMERIC(2)
, name VARCHAR(20)
);
INSERT INTO @tbl_temp2 VALUES (2, 'テーブル2の2');
INSERT INTO @tbl_temp2 VALUES (4, 'テーブル2の4');
この様な二つテーブルからcode列に存在するデータを合成します。
期待する結果はこちら。
tbl_temp1を基準にtbl_temp2を合成しただけなので、何通りか方法はあると思います。
僕は軸となる列を列挙して、その集合に寄せる方法が好みです。 ←スタージョイン
SELECT
*
FROM (
SELECT DISTINCT code FROM @tbl_temp1
UNION
SELECT DISTINCT code FROM @tbl_temp2
) AS [A]
LEFT OUTER JOIN @tbl_temp1 AS [T1] ON T1.code = A.code
LEFT OUTER JOIN @tbl_temp2 AS [T2] ON T2.code = A.code
やりたかった事だけに絞り込むと、こんな感じのクエリーになりました。
で、とりあえずクエリーを実行してみたら、軸になる列がソート済み。
アレ?と思いつつ、色々と調べたら、UNIONでは暗黙のソート処理が走るそうで。
なーる。そう言う事でしたか。
軸となる列(ここでは両方のcode)を列挙する際、どこかにORDER BYが必要だと思ってました。
そんな訳で、この件は以後忘れないように書いておきます。
....
久しぶりの勉強部屋ネタですが、こちらでは仕事部屋にしました。
## しばらくしたら、あちらは閉鎖します。