2010-12-05 14 views
2

特定のデータベースエントリにつき1行だけを返す必要があります。例えば、私が持っている場合:MySQLでSQL SELECT DISTINCTとGROUP BYの問題

ID col1 col2 
1 1 A 
2 1 B 
3 1 C 
4 2 D 
5 3 E 
6 4 F 
7 4 G 

を私は、クエリ

SELECT DISTINCT col1, col2 FROM table GROUP BY col1 

を実行することができますし、私が取得します - 私は同じことを実行する場合、私が欲しいものですが、>

ID col1 col2 
1 1 A 
4 2 D 
5 3 E 
6 4 F 

をSQL Serverでクエリを実行するとエラーが発生します。

基本的に、テーブルの各行から1つ(または最初)の "col1"と "col2"のみを返す必要があります。

SQL Serverの正しい構文は何でしょうか?

ありがとうございました!

アンドレイ

EDIT:

MySQLで動作する完全なクエリがある - >

SELECT DISTINCT list_order, category_name, category_id 
FROM `jos_vm_category` 
WHERE `category_publish` = 'Y' 
GROUP BY list_order 

ので、私はそれからカテゴリ名とCATEGORY_IDを返すようにしたい各 "list_order" 数FOR同じ "list_order"番号を持つ他のすべての行を無視する

+0

@marc_s:OPが取得するエラーは、集計関数の一部でない限り、SQL ServerではすべてのSELECTフィールドがGROUP BY句に表示される必要があるということです。 MySQLはこれを必要としません。 –

+0

MSSQLでエラーが "列 'jos_vm_category.category_id'は、集計関数またはGROUP BY句に含まれていないため、選択リストで無効です。 – Andrej

答えて

2

もう1つの方法は、T-SQLでROW_NUMBER()関数を使用することです。ここではcol1のように何かでデータを「分割」し、それらのデータパーティションごとにインクリメンタルな数値を得ることができます。あなたはそれぞれの「パーティション」のための最初のエントリだけをしたい場合は、単に(共通テーブル式を使用して - CTE)を、このようにそれを照会:

;WITH Distincts AS 
(
    SELECT ID, col1, col2, 
     ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY ID) AS 'RowNo' 
    FROM dbo.Table 
) 
SELECT 
    ID, col1, col2 
FROM 
    Distincts 
WHERE 
    RowNo = 1 

これは私にあなたが探しているの出力が得られます。

+1

これは完璧!ありがとう! – Andrej

+0

は私が遅刻しているように見えます:)しかし、もっとシンプルな代替案があります。 –

+1

@Roopesh - あなたの選択肢は効率が悪く、どちらも簡単です。 –

0

SELECT col1, col2 
FROM table t1 
where not exists 
     (select 1 
     from table t2 
     where t2.col1 = t1.col1 and 
       t2.id < t1.id) 

EDIT次のようにして、COL1の値の最初のインスタンスに対応するすべての行を取得することができます:クエリ の比較を掲載しalt text

EDIT2:実際のクエリの比較を投稿約2000行のデータがランダムに生成され、idは一意のインデックスを持つID列です。 idとcol1の2番目のインデックス。 alt text

結局のところ、Marcのクエリは、少なくともこのデータでは高速です。