- PR -

DISTINCTとORDER BYの併用について

1
投稿者投稿内容
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2008-04-09 07:54
いつもお世話になります。

現在、SQLサーバー2000(SP4)でストアドプロシージャを作成しています。
下記のようにテーブルAからデータを下記抽出結果のような形で取得したいと考えています。

テーブルA
コード1|NO1|コード2|NO2|コード3
------------------------------------
あ    |1|か   |1|さ
あ    |1|か   |2|し
あ    |2|き   |1|さ
あ    |2|き   |2|し
あ    |3|か   |1|さ ・・・重複行

抽出結果
コード1|コード2|コード3
------------------------------------
あ    |か   |さ ・・・テーブルAの1行目と5行目
あ    |か   |し
あ    |き   |さ
あ    |き   |し

処理内容のイメージとしては、
 SELECT DISTINCT コード1,コード2,コード3 FROM テーブルA
 ORDER BY NO1,NO2
と実行し、NO1、NO2の非表示項目で昇順ソートし、かつテーブルAの1行目と5行目の重複も除外したいと考えています。

しかし、DISTINCTとORDER BYを併用する場合、ソートキーは出力項目にする必要があるとされています。(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/tsqlref/ts_sa-ses_0gbp.asp?frame=true)で
すが、NO1とNO2を表示すると1行目と5行目は重複しておらず、除外する事ができません。このような場合、どのようにして上記の抽出結果を得れば良いのでしょうか?

分かりにくい説明で申し訳ありませんが、アドバイスをよろしくお願いします。


ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2008-04-09 08:03
自己レスです。
DISTINCTとORDER BYが併用できないのならと、一度下記のようにサブクエリも考えてみたのですが、エラーになってしまいました。

サブクエリ
 SELECT DISTINCT * FROM
 (SELECT コード1,コード2,コード3 FROM テーブルA ORDER BY NO1,NO2) X

エラーメッセージ
 The ORDER BY clause is invalid in views, inline functions,
 derived tables, and subqueries, unless TOP is also specified.
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2008-04-09 08:33
GROUP BY してみたらどうでしょうか?
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2008-04-09 08:42
コード:

select コード1,コード2,コード3
from テーブルA
group by コード1,コード2,コード3
order by min(NO1),min(NO2);



SQLServer2000で動くかは知りません

テクニカルエンジニア(データベース)だと、
この構文は、文法エラー扱いなんですよね。


[ メッセージ編集済み 編集者: 明智重蔵 編集日時 2008-04-09 08:44 ]
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2008-04-09 09:25
末記人さん、明智重蔵さん、アドバイスありがとうございます!

「GROUP BY」、試してみます!確かにGROUP BYすれば重複は除外できますね!

「order by min(NO1),min(NO2);」とはどういう意味になるのでしょうか?
これも少し試してみようと思います!!

結果は追って報告させて頂きます。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-04-09 09:50
引用:

明智重蔵さんの書き込み (2008-04-09 08:42) より:
コード:
select コード1,コード2,コード3
  from テーブルA 
 group by コード1,コード2,コード3
order by min(NO1),min(NO2);



SQLServer2000で動くかは知りません



SQLServer2000で試したら動きました。
思いつかなかった。。。
1

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