是否可以缩短group by子句,以便您不必重复select子句中提到的字段?例如:
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()存储过程的查询,并且我的变量中的空间不足。非常感谢。
答案 0 :(得分:11)
您在寻找SELECT DISTINCT
或SELECT DISTINCTROW
吗?
答案 1 :(得分:8)
SELECT
field1,
field2,
field3,
field4
FROM table
GROUP BY 1,2,3,4
数字表示选择部分中的列位置。
答案 2 :(得分:1)
DISTINCT和GROUP BY之间存在显着差异。在简单查询中,它们可能是相同的,但当然,GROUP BY允许聚合。
但是除此之外,DISTINCT将在执行DISTINCT之前计算每个字段,即使它们是相同字段的确定性使用(例如,StartDate和DATEADD(day,1,StartDate) - 检查执行计划,你会看到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.*
会很高兴,但如果你愿意,你可以通过https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=124654投票让微软了解
答案 3 :(得分:0)
它们有两个不同的概念:
现在,每个SELECT条目必须聚合在一起或在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
在您的示例中,使用不带GROUP BY的DISTINCT ...