如何在t-sql中使用group with with union

时间:2009-10-22 03:08:27

标签: sql sql-server tsql group-by union

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

4 个答案:

答案 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