如何在T-SQL中使用group by和union

问题描述 投票:0回答:5

如何在 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
sql sql-server t-sql group-by union
5个回答
119
投票

您需要为子查询添加别名。因此,你的陈述应该是:

Select Z.id
From    (
        Select id, time
        From dbo.tablea
        Union All
        Select id, time
        From dbo.tableb
        ) As Z
Group By Z.id

25
投票

按 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

9
投票

识别色谱柱很简单:

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)
或类似内容!


3
投票
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

0
投票

您不需要子查询。
只需尝试一些示例查询,您就会看到结果。

工会示例
从 org 中选择 orgid,其中 orgid = 123
工会
从组织中选择orgid,其中orgid = 123

合并所有示例
从 org 中选择 orgid,其中 orgid = 123
联合所有
从组织中选择orgid,其中orgid = 123

© www.soinside.com 2019 - 2024. All rights reserved.