- PR -

UNION結合後のソート処理について

投稿者投稿内容
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2007-09-11 15:30
引用:

温州蜜柑さんの書き込み (2007-09-11 14:52) より:
これではダメですか?
コード:

select
distinct tbl.data
from
(
select '1' as dummy, data1 as data from table1
union all
select '2' as dummy, data2 as data from table2
) tbl
order by dummy





今Oracleないので確認できないのですが、DISTINCTの場合は選択リストにない項目でOrder byできないかも。(もしかしてできます?)
私だったらNOT EXISTS使いますが、内容に比べてコードが複雑になりますね。

[ メッセージ編集済み 編集者: よっしー 編集日時 2007-09-11 15:31 ]
deanna
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 118
投稿日時: 2007-10-02 11:41
「unionすると結果がソートされる」は間違いです。
そのように見えるだけです。よくある勘違いです。
order byを指定しないと結果の順序は保証されません。マニュアルにも明記されているし、Oracle以外のDBでも同じです。

そもそも、単なるunionでは重複は排除されます。
select 'D1' from dual
union
select 'D1' from dual

select 'D1' from dual
union all
select 'D1' from dual
を比べてみてください。

また、
select distinct * from
(
select 'D1' from dual
union all
select 'D1' from dual
union all
select 'D2' from dual
union all
select 'D3' from dual
)
order by 1
で試してください。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2007-10-02 12:30
deannaさん
こんにちは。

引用:

deannaさんの書き込み (2007-10-02 11:41) より:
「unionすると結果がソートされる」は間違いです。
そのように見えるだけです。よくある勘違いです。
order byを指定しないと結果の順序は保証されません。マニュアルにも明記されているし、Oracle以外のDBでも同じです。


おそらく、質問者も回答者も知っているかと思います。
ただし、UNIONするとどうしても並び順が変わってしまうのでそれを抑えたいのだと思います。

引用:

そもそも、単なるunionでは重複は排除されます。


質問者は重複を排除したいのでは?でもソートしたくないと。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2007-10-02 13:01
引用:
でもソートしたくないと。


「ソートしたくない」という考え方は存在しませんよ。「ソートしたくない=ソートしたい」です。データベースには「ソートしたい」か「ソートはどうでもいい」しかありません。

「ソートしたくない」という強い意思があるということは「ソートはどうでもいい」ではなく、本人が直感的に期待した順序で「ソートしたい」ということを意味しています。

重複行を除去するかどうかは関係なくて、UNION ALL の場合にも、特定の並び順を期待するのであれば、そのようにソートを指示しなくてはいけないのです。UNION と UNION ALL で並び準が違うなんて言ってること自体が誤りですよ。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-10-02 14:02
なんでスレ主さんから返答もないのに続けるんですか?

スキルアップ/キャリアアップ(JOB@IT)