如何在 T-SQL 中使用 group by 和 union ?我想按联合结果的第一列进行分组,我编写了以下 SQL,但它不起作用。我只是不知道如何引用联合结果的指定列(本例中为 1)。
SELECT *
FROM ( SELECT a.id ,
a.time
FROM dbo.a
UNION
SELECT b.id ,
b.time
FROM dbo.b
)
GROUP BY 1
您需要为子查询添加别名。因此,你的陈述应该是:
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 分组
我从来不知道 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
识别色谱柱很简单:
SELECT *
FROM ( SELECT id,
time
FROM dbo.a
UNION
SELECT id,
time
FROM dbo.b
)
GROUP BY id
但是它并没有解决这个查询的主要问题:按第一列值分组后,如何处理第二列值?由于(特别!)您使用的是
UNION
而不是 UNION ALL
,因此联合中的两个子表之间不会有 完全重复 行,但您仍然可能有一个值的多个时间值的 id,并且您没有提示您想要做什么 - 最小值,最大值,平均值,总和,还是什么?!因此,SQL 引擎应该给出一个错误(尽管有些(例如 mysql)只是从多个值中选择一个随机值,但我相信 sql-server 比这更好)。
因此,例如,将第一行更改为
SELECT id, MAX(time)
或类似内容!
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
您不需要子查询。
只需尝试一些示例查询,您就会看到结果。
工会示例
从 org 中选择 orgid,其中 orgid = 123
工会
从组织中选择orgid,其中orgid = 123
合并所有示例
从 org 中选择 orgid,其中 orgid = 123
联合所有
从组织中选择orgid,其中orgid = 123