2009-10-19 236 views
3

是否可以缩短group by子句,以便您不必重复select子句中提到的字段ad nauseam?例如:缩短GROUP BY子句

SELECT 
    field1, 
    field2, 
    field3, 
    field4 
FROM table 
GROUP BY 
    field1, 
    field2, 
    field3, 
    field4 

to: 

SELECT 
field1, 
field2, 
field3, 
field4 
FROM table 
GROUP BY 
SELECT.* 

...或这个效果。我正在编写一个将使用sp_executesql()存储过程的查询,并且我的变量中可用空间不足。非常感谢。

回答

11

你在寻找SELECT DISTINCT or SELECT DISTINCTROW

+1

Crud。是的,那里有一个脑袋。完全忘记了独特。谢谢。 – DaWolfman 2009-10-19 14:06:40

+0

我投了弃权票,然后意识到DISTINCT回答了他实际问到的问题。抱歉。 – 2009-10-19 14:13:18

8
SELECT 
    field1, 
    field2, 
    field3, 
    field4 
FROM table 
GROUP BY 1,2,3,4 

其中数字表示选择部分中的柱位置。

+0

+1 - 伟大的捷径! – 2009-10-19 14:05:11

+0

不知道。谢谢你的提示! – DaWolfman 2009-10-19 14:09:13

+0

不错的一个:)今天学到了一些新东西 – knittl 2009-10-19 14:09:30

0

他们是两个不同的概念:

  • SELECT =输出
  • GROUP BY =什么聚集在

现在,每个选定条目,必须综合或GROUP BY。通常,GROUP BY也有更多列,即SELECT。

但是,我怀疑你是聚合太多/太晚。您可以使用派生表或CTE来“更早”地完成任务。

SELECT 
    T1.field1, T1.field2, foo.field3, foo.field4, foo.AggField5 
FROM 
    table T1 
    JOIN 
    (SELECT 
     T2.keycol, T2.field3, T2.field4, SUM(T2.field5) AS AggField5 
    FROM 
     table T2 
    GROUP BY 
     T2.keycolT2.field3, T2.field4 
    ) foo ON T1.Keycol = foo.keycol 

在你的榜样,虽然,使用DISTINCT没有GROUP BY ...

1

有DISTINCT和GROUP BY之间的显著差异。在简单的查询中,它们可能是相同的,尽管GROUP BY允许聚合。

但除了这一点,DISTINCT将制定出每场做DISTINCT之前,即使是同一领域的确定性的用途(例如,起始日期和DATEADD(天,1,起始日期) - 检查执行计划,你会发现DATEADD是在DISTINCT之前完成的,因此GROUP BY几乎总是更好。

但是......值得注意的是,只要GROUP BY包含某个唯一索引它(例如主键),该表中的任何其他项都将被忽略。毕竟,通过在GROUP BY子句中包含其他字段,您将无法获得更多唯一性。那么,为什么不采取的做法:

GROUP BY t.id, u.id 
/* All these other fields are ignored but here because they're 
    in the HAVING/SELECT/ORDER BY clauses 
*/ 
, t.TransactionValue, u.Username, .... 

我得到你仍然不必键入这一切,它会是不错的GROUP BY t.*,但如果你想,你可以让微软通过投票表决知道at https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=124654