Pergunta

Como posso usar grupo, com a união em T-SQL? Quero grupo pela primeira coluna de um resultado de união, eu escrevi o seguinte sql, mas ele não funciona. Eu só não sei como fazer referência a uma coluna específica (neste caso é 1) do resultado união. grandes graças.

SELECT  *
FROM    ( SELECT    a.id ,
                    a.time
          FROM      dbo.a
          UNION
          SELECT    b.id ,
                    b.time
          FROM      dbo.b
        )
GROUP BY 1
Foi útil?

Solução

GROUP BY 1

Eu nunca conheci GROUP BY para apoiar usando ordinais, única ORDER BY. De qualquer forma, apenas MySQL suporta GROUP BY não está incluindo todas as colunas sem funções agregadas executadas sobre eles. Ordinais não são recomendados prática, quer porque se eles são baseados na ordem do SELECT -. Se isso mudar, assim que faz seu ORDER BY (ou GROUP BY se suportado)

Não há necessidade de correr GROUP BY sobre o conteúdo quando você está usando UNION - garante união que duplicatas são removidos; UNION ALL é mais rápido porque ele não faz - e, nesse caso, seria necessário o GROUP BY ...

A sua consulta só precisa ser:

SELECT a.id,
       a.time
  FROM dbo.TABLE_A a
UNION
SELECT b.id,
       b.time
  FROM dbo.TABLE_B b

Outras dicas

Você precisa alias subconsulta. Assim, sua declaração deve ser:

Select Z.id
From    (
        Select id, time
        From dbo.tablea
        Union All
        Select id, time
        From dbo.tableb
        ) As Z
Group By Z.id

A identificação da coluna é fácil:

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

Mas isso não resolve o problema principal desta consulta: o que está a ser feito com o segundo valores de coluna sobre agrupamento pela primeira vez? Desde (peculiarmente!) Que você está usando UNION em vez de UNION ALL, você não terá que totalmente duplicado linhas entre as duas subtabelas na união, mas você ainda pode muito bem ter vários valores de tempo para um valor do id, e você dá nenhuma dica do que você quer fazer - min, max, avg, sum, ou o que ?! O motor de SQL deve dar um erro por causa disso (embora alguns, como mysql basta escolher um valor aleatório-ish fora do vários, eu acredito sql-server é melhor do que isso).

Assim, por exemplo, alterar a primeira linha para SELECT id, MAX(time) ou similares!

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top