- PR -

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

投稿者投稿内容
ちばじん
会議室デビュー日: 2007/08/14
投稿数: 7
投稿日時: 2007-09-10 23:09
ORACLEにてUNION結合をすると結果がソートされてしまいます。

検索結果で重複データを出力せず、並び替えを行わないようにするにはどうしたらいいでしょうか?

具体的にやりたいことは
 SELECT DATA1 AS DATA FROM TABLE1
UNION SELECT DATA2 AS DATA FROM TABLE2
UNION SELECT DATA3 AS DATA FROM TABLE3
とした場合、DATAをDATA1、DATA2、DATA3の順でかつ重複を出力しないようにしたいのですが。。。

以上です。よろしくお願いします。
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-09-11 02:55
saki1208です。

UNION使用すると、重複行の除外のためにいったんソート
されたかと。
実行計画を取ってみればわかるはず。
# 手元に環境がないので確認できませんが。

で、実現方法ですが、「UNION ALLとROW_NUMBER」を使用するか
「NOT EXISTS」を使用すればできるんじゃないですかねぇ。
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2007-09-11 09:52
検証してないけど、
各テーブル毎にダミーの項目を追加すればいけるかも。
#嘘だったら申し訳ないです。
select '1' as dummy, data1 as data from table1
union
select '2' as dummy, data2 as data from table2
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-09-11 12:32
引用:

KOXさんの書き込み (2007-09-11 09:52) より:
検証してないけど、
各テーブル毎にダミーの項目を追加すればいけるかも。
#嘘だったら申し訳ないです。
select '1' as dummy, data1 as data from table1
union
select '2' as dummy, data2 as data from table2


たぶん同一テーブル内の重複は排除できるが、table1、table2をまたがった重複は排除できない気がします。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2007-09-11 12:51
無理だろうとは思いつつ、

UNION ALLの後にDISTINCTはどうでしょう?

万一できたとしても並び順は保証されないと思いますけど。
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2007-09-11 14:24
msoです。

minusをつかうのはどうでしょうか?

select 1 as dummy, employee_id from employees
minus
select 2 as dummy, employee_id from copy_emp
order by dummy
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-09-11 14:39
引用:

かずくんさんの書き込み (2007-09-11 12:32) より:
引用:

KOXさんの書き込み (2007-09-11 09:52) より:
検証してないけど、
各テーブル毎にダミーの項目を追加すればいけるかも。
#嘘だったら申し訳ないです。
select '1' as dummy, data1 as data from table1
union
select '2' as dummy, data2 as data from table2


たぶん同一テーブル内の重複は排除できるが、table1、table2をまたがった重複は排除できない気がします。

引用:
で、実現方法ですが、「UNION ALLとROW_NUMBER」を使用するか
「NOT EXISTS」を使用すればできるんじゃないですかねぇ。

両方を踏まえて、(未検証です)

コード:

select '1' as dummy, data1 as data from table1 where not exists
(select * from table2 whewe table2.data2 = tabl1.data )
union
select '2' as dummy, data2 as data from table2
order by dummy


3つめのテーブルも応用で。

#not existsのつけ方に気をつけて、
#間違えると重複してるレコードはどこにも出力されないとかになっちゃう

↓ん?・・・・これでいい気がする

[ メッセージ編集済み 編集者: べる 編集日時 2007-09-11 15:14 ]
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 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



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