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

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

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

Re[2]: SQLでDISTINCTとROWNUMの使い方について


(過去ログ 19 を表示中)

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

■7960 / inTopicNo.1)  SQLでDISTINCTとROWNUMの使い方について
  
□投稿者/ アンク (1回)-(2007/09/20(Thu) 16:40:41)

分類:[.NET 全般] 

2007/09/20(Thu) 16:53:38 編集(投稿者)

こんにちは、はじめまして。

質問なのですが、SQLでROWNUMで番号をつけているのですが、その際にDISTINCTを使うとDISTINCTが適用されないのです。
どのように記述したらよいでしょうか?

現在は下記のように記述しています。

SELECT DISTINCT ROWNUM,1.ColA,2.ColB
FROM (SELECT ColA,ColB FROM TABLE1 1,TABLE2 2 WHERE 1.ColA = 2.ColA ORDER BY 1.ColA),TABLE1 1,TABLE2 2
WHERE 1.ColA = 2.ColA

こんな感じに書いております。
引用返信 編集キー/
■7975 / inTopicNo.2)  Re[1]: SQLでDISTINCTとROWNUMの使い方について
□投稿者/ きょろ (6回)-(2007/09/20(Thu) 18:26:35)
今、検証する環境と時間がないので、思いあたる点を書かせていただきます。

ROWNUMのあとにDISTINCTが実行されるんじゃないでしょうか。
まず行番号が振られるので、重複とはみなされないのでは・・・?

DISTINCT部分をインラインビューにしてからROWNUM。
これで解決できませんでしょうか。

試してみたいんですが、ORACLE環境が今ありません〜
全然違っていたらすみません。どなたかフォローくださーい。
引用返信 編集キー/
■8010 / inTopicNo.3)  Re[2]: SQLでDISTINCTとROWNUMの使い方について
□投稿者/ アンク (2回)-(2007/09/21(Fri) 09:17:24)
No7975 (きょろ さん) に返信
> 今、検証する環境と時間がないので、思いあたる点を書かせていただきます。
>
> ROWNUMのあとにDISTINCTが実行されるんじゃないでしょうか。
> まず行番号が振られるので、重複とはみなされないのでは・・・?
>
> DISTINCT部分をインラインビューにしてからROWNUM。
> これで解決できませんでしょうか。
>
> 試してみたいんですが、ORACLE環境が今ありません〜
> 全然違っていたらすみません。どなたかフォローくださーい。

SELECT ROWNUM,1.ColA,2.ColB
FROM (SELECT DISTINCT ColA,ColB FROM TABLE1 1,TABLE2 2 WHERE 1.ColA = 2.ColA ORDER BY 1.ColA),TABLE1 1,TABLE2 2
WHERE 1.ColA = 2.ColA

こんな感じでしょうか?インラインビューについては、いまいちまだ理解しきれてないのですが、上記のようにやると
表示件数がたしかに一部DISTINCTされているようなのですが、それでもまだまだ件数が多く出てきてしまいます。

引用返信 編集キー/
■8013 / inTopicNo.4)  Re[3]: SQLでDISTINCTとROWNUMの使い方について
□投稿者/ ひろ (38回)-(2007/09/21(Fri) 10:57:55)
No8010 (アンク さん) に返信

  アンクさんがやりたいことってこんな感じ?

  ・TABLE1.ColA に該当する TABLE2.ColB をダブりなく取得したい。
  ・その時、TABLE1.ColA の順番で取得したい。
  ・ついでに ColA の内容も欲しい。

  まず、DISTICT は DISTINCT の後の「カラムの組み合わせ」に効いてきます。

  SELECT DISTINCT A,B FROM …

  と書いたら、 A と B の「組み合わせ」でダブりがないものを抽出します。
  
  アンクさんが求めているものが上記のことだとすると、

  @ TABLE1.ColA に該当する TABLE2.ColB 「だけ」を抽出する SQL を考える。
     

> ■No7975 (きょろ さん) に返信
>>今、検証する環境と時間がないので、思いあたる点を書かせていただきます。
>>
>>ROWNUMのあとにDISTINCTが実行されるんじゃないでしょうか。
>>まず行番号が振られるので、重複とはみなされないのでは・・・?
>>
>>DISTINCT部分をインラインビューにしてからROWNUM。
>>これで解決できませんでしょうか。
>>
>>試してみたいんですが、ORACLE環境が今ありません〜
>>全然違っていたらすみません。どなたかフォローくださーい。
> 
> SELECT  ROWNUM,1.ColA,2.ColB
> FROM (SELECT DISTINCT ColA,ColB FROM TABLE1 1,TABLE2 2 WHERE 1.ColA = 2.ColA ORDER BY 1.ColA),TABLE1 1,TABLE2 2
> WHERE 1.ColA = 2.ColA 
> 
> こんな感じでしょうか?インラインビューについては、いまいちまだ理解しきれてないのですが、上記のようにやると
> 表示件数がたしかに一部DISTINCTされているようなのですが、それでもまだまだ件数が多く出てきてしまいます。
> 

引用返信 編集キー/
■8016 / inTopicNo.5)  Re[4]: SQLでDISTINCTとROWNUMの使い方について
□投稿者/ ひろ (39回)-(2007/09/21(Fri) 11:12:13)
No8013 (ひろ さん) に返信

あら、ごめんなさい。途中で送信されてしまいました。
あらためて書き直します。

まず、DISTICT について。
DISTINCT は、DISTINCT の後の「カラムの組み合わせ」に効いてきます。

SELECT DISTINCT A,B FROM …

と書いたら、 A と B の「組み合わせ」でダブりがないものを抽出します。
A だけに有効ってわけじゃないので注意です。

次に ROWNUM。
ROWNUM は、それが記入された SELECT 文の「最終結果」に付けられます。

アンクさんがやりたいことってこんな感じ?

・TABLE1.ColA に該当する TABLE2.ColB をダブりなく取得したい。
・その時、TABLE1.ColA の順番で取得したい。
・ついでに ColA の内容も欲しい。

アンクさんが求めているものが上記のことだとすると、
まず、TABLE1.ColA に該当する TABLE2.ColB 「だけ」を抽出する SQL を考えます。

SELECT DISTINCT T2.ColB
FROM TABLE1 T1, TABLE2 T2
WHERE T2.ColA = T1.ColA
ORDER BY T1.ColA;

次に、この結果に対する ColA を抽出します。

SELECT ROWNUM, S2.ColA, S1.ColB
FROM (SELECT DISTINCT T2.ColB
FROM TABLE1 T1, TABLE2 T2
WHERE T2.ColA = T1.ColA
ORDER BY T1.ColA) S1,
TABLE2 S2
WHERE S2.ColB = S1.ColB;

但し、この場合、TABLE2 の ColB から見た ColA が一意に決まるという条件が付きます。
もし、これが一意に決まらない場合、アンクさんがやりたいことは出来ないってことに…

引用返信 編集キー/
■8019 / inTopicNo.6)  Re[3]: SQLでDISTINCTとROWNUMの使い方について
□投稿者/ ぼのぼの (95回)-(2007/09/21(Fri) 11:36:08)
アンクさんの提示したSQL、読みづらかったのでインデントしてみたんですけど。

最初(■7960)のやつ
SELECT DISTINCT
  ROWNUM,
  1.ColA,
  2.ColB
FROM
  (
    SELECT
      ColA,
      ColB
    FROM
      TABLE1 1,
      TABLE2 2
    WHERE
      1.ColA = 2.ColA
    ORDER BY
      1.ColA
  ),
  TABLE1 1,
  TABLE2 2
WHERE
  1.ColA = 2.ColA 

2つめ(■No8010)のやつ
SELECT
  ROWNUM,
  1.ColA,
  2.ColB
FROM
  (
    SELECT DISTINCT
      ColA,
      ColB
    FROM
      TABLE1 1,
      TABLE2 2
    WHERE
      1.ColA = 2.ColA
    ORDER BY
      1.ColA
  ),
  TABLE1 1,
  TABLE2 2
WHERE
  1.ColA = 2.ColA 

あれ?FROM句のサブクエリ、使われてなくないですか?(^^;

やりたいことがちゃんと見えてないですが、特定のカラムでグループ化したいなら、
DISTINCTの代わりにGROUP BYの使用を検討するのもありかも?

引用返信 編集キー/
■8038 / inTopicNo.7)  Re[1]: SQLでDISTINCTとROWNUMの使い方について
□投稿者/ はつね (277回)-(2007/09/21(Fri) 15:39:08)
No7960 (アンク さん) に返信
> 質問なのですが、SQLでROWNUMで番号をつけているのですが、その際にDISTINCTを使うとDISTINCTが適用されないのです。
> どのように記述したらよいでしょうか?
> 
> SELECT DISTINCT ROWNUM,1.ColA,2.ColB
> FROM (SELECT ColA,ColB FROM TABLE1 1,TABLE2 2 WHERE 1.ColA = 2.ColA ORDER BY 1.ColA),TABLE1 1,TABLE2 2
> WHERE 1.ColA = 2.ColA 

SELECT ROWNUM,ColA,ColB
  FROM (SELECT DISTINCT 1.ColA,2.ColB
          FROM (SELECT ColA,ColB           |
                  FROM TABLE1 1,TABLE2 2   |ここの部分がちがうんでない?
                 WHERE 1.ColA=2.ColA),     |
               TABLE1 1,TABLE2 2
         WHERE 1.ColA=2.ColA
         ORDER BY ColA)

引用返信 編集キー/
■8039 / inTopicNo.8)  Re[2]: SQLでDISTINCTとROWNUMの使い方について
□投稿者/ HiJun (72回)-(2007/09/21(Fri) 15:58:28)
No7960 (アンク さん) に返信
まず気になるのが
>FROM (SELECT ColA,ColB FROM TABLE1 1,TABLE2 2 WHERE 1.ColA = 2.ColA ORDER BY 1.ColA),TABLE1 1,TABLE2 2 
ですが、括弧内のSELECT文の結果とTABLE1とTABLE2の
直積になるから当然ダブる。

また、ROWNUMは、レコード毎に付くので
>SELECT DISTINCT ROWNUM,1.ColA,2.ColB
の結果として1.ColA,2.ColBのだぶっているけど、ROWNUMが違うのでDISTINCTが聞かないと
言うことでしょうね。

よって、こんな感じかな...
SELECT  ROWNUM, RET.ColA, RET.ColB
FROM (SELECT DISTINCT TABLE1.ColA, TABLE2.ColB  
        FROM TABLE1,TABLE2 
       WHERE TABLE1.ColA = TABLE2.ColA 
     ) RET

エラーが出たらスンマソ。

 

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -