Как использовать группу с помощью union в t-sql
Как я могу использовать группу с помощью 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 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
Вам нужен псевдоним подзапроса. Таким образом, ваше утверждение должно быть:
Select Z.id
From (
Select id, time
From dbo.tablea
Union All
Select id, time
From dbo.tableb
) As Z
Group By Z.id
Ответ 3
Идентификация столбца проста:
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-сервер лучше этого).
Итак, например, измените первую строку на SELECT id, MAX(time)
или тому подобное!