2010-12-05 286 views
2

我需要每個特定數據庫條目只返回1行。對於例如如果我有: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 

在MySQL中,我可以運行一個查詢

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中查詢我得到一個錯誤..

所以,基本上我需要從表中的每一行返回只有一個(或第一)「col1」和其「col2」..

什麼是SQL Server的正確語法?

謝謝你的時間!

安德烈

編輯:

,在MySQL的工作完整的查詢 - >

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

所以,對於每一個 「list_order」 號我要回不同於CATEGORY_NAME和CATEGORY_ID行,並忽略具有相同「list_order」編號的其他行

+0

@marc_s:我猜OP得到的錯誤是SQL Server要求所有`SELECT`字段出現在`GROUP BY`子句中,除非它們是聚合函數的一部分。 MySQL不需要這個。 – 2010-12-05 18:18:35

+0

MSSQL中的錯誤是「列'jos_vm_category.category_id'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。」 – Andrej 2010-12-05 18:20:33

回答

2

另一種方法是在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 

這給了我,你要尋找的輸出。

0

你可以得到相應的值在COL1一審的所有行如下

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

編輯:發佈查詢 的比較alt text

EDIT2:過帳實際查詢的比較執行計劃,隨機生成大約2000行數據,並且id是具有唯一索引的標識列。關於id和col1的第二個索引。 alt text

原來,Marc的查詢速度畢竟至少有了這個數據!