如何在t-sql中使用group by with union?我想按联合结果的第一列分组,我写了下面的sql但它不起作用。我只是不知道如何引用union结果的指定列(在本例中为1)。 非常感谢。
SELECT *
FROM ( SELECT a.id ,
a.time
FROM dbo.a
UNION
SELECT b.id ,
b.time
FROM dbo.b
)
GROUP BY 1
答案 0 :(得分:87)
您需要为子查询添加别名。因此,您的陈述应该是:
Select Z.id
From (
Select id, time
From dbo.tablea
Union All
Select id, time
From dbo.tableb
) As Z
Group By Z.id
答案 1 :(得分:18)
GROUP BY 1
我从来不知道GROUP BY支持使用序数,只支持ORDER BY。无论哪种方式,只有MySQL支持GROUP BY不包括没有在它们上执行聚合函数的所有列。不建议使用普通法,因为如果它们基于SELECT的顺序 - 如果它发生变化,那么你的ORDER BY(或者如果支持则为GROUP BY)也是如此。
当您使用GROUP BY
时,无需对内容运行UNION
- UNION可确保删除重复项; UNION ALL
更快,因为它没有 - 在这种情况下,你需要GROUP BY ...
您的查询只需要:
SELECT a.id,
a.time
FROM dbo.TABLE_A a
UNION
SELECT b.id,
b.time
FROM dbo.TABLE_B b
答案 2 :(得分:6)
识别列很简单:
SELECT *
FROM ( SELECT id,
time
FROM dbo.a
UNION
SELECT id,
time
FROM dbo.b
)
GROUP BY id
但它并没有解决这个查询的主要问题:第一列分组时第二列值要做什么?由于(特别!)您使用的是UNION
而不是UNION ALL
,因此您在联合中的两个子表之间不会有完全重复的行,但您可能仍然非常对于id的一个值,你有多个时间值,并且你没有提示你想做什么 - min,max,avg,sum或者什么?!因此,SQL引擎应该给出一个错误(虽然某些例如mysql只是从几个中选择一个随机值,我相信sql-server比这更好)。
因此,例如,将第一行更改为SELECT id, MAX(time)
或类似内容!
答案 3 :(得分:-2)
with UnionTable as
(
SELECT a.id, a.time FROM dbo.a
UNION
SELECT b.id, b.time FROM dbo.b
) SELECT id FROM UnionTable GROUP BY id