刹那(せつな)の瞬き

Willkömmen! Ich heiße Setsuna. Haben Sie etwas Zeit für mich?

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列に存在するデータを合成します。
期待する結果はこちら。

Sql

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が必要だと思ってました。
そんな訳で、この件は以後忘れないように書いておきます。

....

久しぶりの勉強部屋ネタですが、こちらでは仕事部屋にしました。
## しばらくしたら、あちらは閉鎖します。