Вопрос

Как я могу использовать 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top