2010-12-05 290 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的查询速度毕竟至少有了这个数据!