C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 2つのテーブルをUnionしてソートして一定件数で区切って…


(過去ログ 11 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■2181 / inTopicNo.1)  2つのテーブルをUnionしてソートして一定件数で区切って…
  
□投稿者/ シャノン (111回)-(2007/03/23(Fri) 17:04:01)
シャノン さんの Web サイト

分類:[データベース全般] 

2007/03/23(Fri) 17:04:15 編集(投稿者)
Oracle 10g です。

「2つのテーブルの検索結果をUnionし、それをソートし、
一定件数で区切り、かつ、その一定件数をオーバーしたか
どうかを調べる」ということをやりたいのですが…

今、「オーバーしたかどうかを調べる」を除いた部分は
できています。
こんな感じ…

SELECT
	*
FROM
	(
		SELECT
			HOGE,
			ROW_NUMBER() OVER ( ORDER BY HOGE ) RN
		FROM
			(
				SELECT
					HOGE
				FROM
					TABLE1
				UNION
				SELECT
					HOGE
				FROM
					TABLE2
				ORDER BY
					1
			)
	)
WHERE
	RN <= 100

オーバーしたかどうかを調べるのは、もう一段 SELECT を増やせば
できるのかなぁ…とか思っていますが、既に三段構えになっているため、
できればこれ以上増やしたくありません。
既存の SQL の短縮も含めて、何かいい方法はありませんでしょうか?

引用返信 編集キー/
■2182 / inTopicNo.2)  Re[1]: 2つのテーブルをUnionしてソートして一定件数で区切って…
□投稿者/ シャノン (112回)-(2007/03/23(Fri) 17:12:21)
シャノン さんの Web サイト
No2181 (シャノン さん) に返信
> 「2つのテーブルの検索結果をUnionし、それをソートし、
> 一定件数で区切り、かつ、その一定件数をオーバーしたか
> どうかを調べる」ということをやりたいのですが…

欲しい最大件数 + 1 件を上限として、その + 1 件が取れたか
どうかで判断できますね。
最後の1件以外を表示するのはプログラムでどうにか。

ただ、現在の3段 SELECT も、もっとスマートにできるなら
したいので、スレはしばらく閉めずにおいてみます。
引用返信 編集キー/
■2198 / inTopicNo.3)  Re[1]: 2つのテーブルをUnionしてソートして一定件数で区切って…
□投稿者/ オショウ (5回)-(2007/03/25(Sun) 21:36:03)
> Oracle 10g です。
>
> 「2つのテーブルの検索結果をUnionし、それをソートし、
> 一定件数で区切り、かつ、その一定件数をオーバーしたか
> どうかを調べる」ということをやりたいのですが…

  やりたいことは解りましたが、例のSQLではWhereが無いので
  正しく検索はできませんネ!〜

  件数であれば、count(*)で、件数取得するだけでよいのでは?

以上。
引用返信 編集キー/
■2206 / inTopicNo.4)  Re[2]: 2つのテーブルをUnionしてソートして一定件数で区切って…
□投稿者/ はつね (107回)-(2007/03/26(Mon) 18:38:16)
はつね さんの Web サイト
No2198 (オショウ さん) に返信
>   やりたいことは解りましたが、例のSQLではWhereが無いので
>   正しく検索はできませんネ!〜

UNIONしてソートして、OW_NUMBER() OVER ( ORDER BY HOGE ) RN したものに対してWHEREで上限絞込みしているので問題ないと思いますよ。


>   件数であれば、count(*)で、件数取得するだけでよいのでは?

それぞれは単独ですが、上限で打ち切り「かつ」打ち切ったか判定する条件になってるところが難しいんですよね〜。



引用返信 編集キー/
■2207 / inTopicNo.5)  Re[3]: 2つのテーブルをUnionしてソートして一定件数で区切って…
□投稿者/ シャノン (113回)-(2007/03/26(Mon) 19:01:02)
シャノン さんの Web サイト
No2206 (はつね さん) に返信
> それぞれは単独ですが、上限で打ち切り「かつ」打ち切ったか判定する条件になってるところが難しいんですよね〜。

データ件数が膨大になり得る(だからこそ上限で打ち切りたい)ので、COUNT(*) に時間がかかってしまうのは避けたいんです。
「全部で何件あったか」は必要ではないので、「打ち切ったかどうか」ならば、既に実現できています(>>No2182)。

> UNIONしてソートして、OW_NUMBER() OVER ( ORDER BY HOGE ) RN したものに対してWHEREで上限絞込み

上限絞り込みの一般的な方法は、やはりこうなるのでしょうか?
本題の問い合わせはいちばん内側の SELECT で終わっているのに、行番号を付加するためだけにもう一段、絞り込むためにさらに一段増えるのが、どうにかならないかと思っているのですが…

#一応、解決チェックしておきます。
解決済み
引用返信 編集キー/
■2208 / inTopicNo.6)  Re[4]: 2つのテーブルをUnionしてソートして一定件数で区切って…
□投稿者/ 明智重蔵 (2回)-(2007/03/26(Mon) 19:44:43)
明智重蔵 さんの Web サイト
2007/03/26(Mon) 23:21:11 編集(投稿者)
2007/03/26(Mon) 19:46:43 編集(投稿者)

これでいかが?

SELECT *
FROM(SELECT HOGE,
ROW_NUMBER() OVER ( ORDER BY HOGE ) RN,
max(decode(rowNum,100+1,1,0)) over() as Flag
FROM (SELECT HOGE
FROM TABLE1
UNION
SELECT HOGE
FROM TABLE2))
WHERE RN <= 100

もしくは
SELECT *
FROM(SELECT HOGE,
ROW_NUMBER() OVER ( ORDER BY HOGE ) RN,
case when count(*) over() > 100 then 1 else 0 end as flag
FROM (SELECT HOGE
FROM TABLE1
UNION
SELECT HOGE
FROM TABLE2))
WHERE RN <= 100

もしくは
SELECT *
FROM(SELECT HOGE,
RowNum RN,
case when count(*) over() > 100 then 1 else 0 end as flag
FROM (SELECT HOGE
FROM TABLE1
UNION
SELECT HOGE
FROM TABLE2
order by hoge)
where RowNum <= 100+1)
WHERE RN <= 100


わんくま同盟のおっかけ 明智重蔵

なんかやたらとスパムとみなされるのですが
解決済み
引用返信 編集キー/
■2209 / inTopicNo.7)  Re[4]: 2つのテーブルをUnionしてソートして一定件数で区切って…
□投稿者/ はつね (108回)-(2007/03/26(Mon) 19:45:01)
はつね さんの Web サイト
No2207 (シャノン さん) に返信
>>UNIONしてソートして、OW_NUMBER() OVER ( ORDER BY HOGE ) RN したものに対してWHEREで上限絞込み
>
> 上限絞り込みの一般的な方法は、やはりこうなるのでしょうか?

Oracleつかった場合の一般的な方法は、こうなります。TOP句とかないですからね。

解決済み
引用返信 編集キー/
■2246 / inTopicNo.8)  Re[5]: 2つのテーブルをUnionしてソートして一定件数で区切って…
□投稿者/ シャノン (116回)-(2007/03/28(Wed) 17:01:55)
シャノン さんの Web サイト
No2208 (明智重蔵 さん) に返信
> 2007/03/26(Mon) 23:21:11 編集(投稿者)
> 2007/03/26(Mon) 19:46:43 編集(投稿者)
>
> これでいかが?

ありがとうございます。

1番目と3番目の例は ROWNUM を使っていますが…
ROWNUM は ORDER BY が考慮されないと聞いたので避けて、ROW_NUMBER を使っていました。
ORDER BY した結果に対する ROWNUM なら、ROW_NUMBER と同じ結果になるのでしょうか。

その場合の ROWNUM と ROW_NUMBER に違いがないとするなら、2つ目と3つ目の違いは、2段目の SELECT で絞り込みをかけているか、いないかだけになるのでしょうか。
1番目との違いは、判定方法が「ROWNUM が 101 の行があるか?」か「件数が 101 以上あるか?」かの違いですね。

MAX や COUNT に OVER を指定する方法は知りませんでした。
分析関数というようですね。

SQL は奥が深いです…
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -