Как использовать group by с union в t-sql
-
05-07-2019 - |
Вопрос
Как я могу использовать 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
Решение
ГРУППА ПО 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 Z.id
From (
Select id, time
From dbo.tablea
Union All
Select id, time
From dbo.tableb
) As Z
Group By Z.id
Определить столбец легко:
SELECT *
FROM ( SELECT id,
time
FROM dbo.a
UNION
SELECT id,
time
FROM dbo.b
)
GROUP BY id
Но это не решает основную проблему этого запроса: что делать со значениями второго столбца при группировании по первому? Поскольку (странно!) Вы используете UNION
, а не UNION ALL
, у вас не будет строк полностью дублированных между двумя подтаблицами в union, но у вас все еще может быть несколько значений времени для одного значения id, и вы не дадите подсказки о том, что вы хотите сделать - min, max, avg, sum или что ?! Из-за этого механизм SQL должен выдавать ошибку (хотя некоторые, такие как mysql, просто выбирают случайное значение из нескольких, я считаю, что sql-сервер лучше).
Так, например, измените первую строку на 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