30

如何在 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
4

4 回答 4

109

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

Select Z.id
From    (
        Select id, time
        From dbo.tablea
        Union All
        Select id, time
        From dbo.tableb
        ) As Z
Group By Z.id
于 2009-10-29T05:10:27.390 回答
24

按 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
于 2009-10-22T03:29:39.457 回答
8

识别列很容易:

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

于 2009-10-22T03:45:09.083 回答
1
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
于 2018-03-12T19:38:06.767 回答