Как использовать group by с union в t-sql - PullRequest
22 голосов
/ 22 октября 2009

Как я могу использовать group by с union в t-sql? Я хочу сгруппировать по первому столбцу результата объединения, я написал следующий 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 ]

87 голосов
/ 29 октября 2009

Вам необходимо создать псевдоним подзапроса. Таким образом, ваше заявление должно быть:

Select Z.id
From    (
        Select id, time
        From dbo.tablea
        Union All
        Select id, time
        From dbo.tableb
        ) As Z
Group By Z.id
18 голосов
/ 22 октября 2009

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
6 голосов
/ 22 октября 2009

Определение столбца легко:

SELECT  *
FROM    ( SELECT    id,
                    time
          FROM      dbo.a
          UNION
          SELECT    id,
                    time
          FROM      dbo.b
        )
GROUP BY id

Но это не решает основную проблему этого запроса: что делать со значениями второго столбца при группировании по первому?Поскольку (что странно!) Вы используете UNION вместо UNION ALL, у вас не будет полностью дублированных строк между двумя подтаблицами в объединении, но вы все равно можете иметь несколько значенийвремя для одного значения идентификатора, и вы не намекаете на то, что вы хотите сделать - min, max, avg, sum или что ?!Из-за этого механизм SQL должен выдавать ошибку (хотя некоторые, такие как mysql, просто выбирают случайное значение из нескольких, я считаю, что sql-сервер лучше этого).

Так, например,измените первую строку на SELECT id, MAX(time) или подобное!

0 голосов
/ 12 марта 2018
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
...