Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Removendo duplicatas do resultado de várias associações em tabelas com colunas diferentes no MySQL


Não sei se entendi seu problema, mas por que você está usando um LEFT JOIN? A história soa mais como um INNER JOIN. Nada aqui exige uma UNIÃO.

[Edit] OK, acho que entendi o que você quer agora. Eu nunca tentei o que estou prestes a sugerir e, além disso, alguns bancos de dados não suportam (ainda), mas acho que você deseja uma função de janela.
WITH Y2 AS (SELECT Y.*, ROW_NUMBER() OVER (PARTITION BY A) AS YROW FROM Y),
     Z2 AS (SELECT Z.*, ROW_NUMBER() OVER (PARTITION BY A) AS ZROW FROM Z)
SELECT COALESCE(Y2.A,Z2.A) AS A, Y2.C, Y2.D, Z2.E, Z2.F, Z2.G
FROM Y2 FULL OUTER JOIN Z2 ON Y2.A=Z2.A AND YROW=ZROW;

A ideia é imprimir a lista no menor número de linhas possível, certo? Portanto, se A1 tiver 10 entradas em Y e 7 em Z, obteremos 10 linhas com 3 com NULLs para os campos Z. Isso funciona no Postgres. Eu não acredito que essa sintaxe esteja disponível no MySQL.

Y:
 a | d | c  
---+---+----
 1 | 1 | -1
 1 | 2 | -1
 2 | 0 | -1

Z:
 a | f | g | e 
---+---+---+---
 1 | 9 | 9 | 0
 2 | 1 | 1 | 0
 3 | 0 | 1 | 0

Saída da declaração acima:
 a | c  | d | e | f | g 
---+----+---+---+---+---
 1 | -1 | 1 | 0 | 9 | 9
 1 | -1 | 2 |   |   |  
 2 | -1 | 0 | 0 | 1 | 1
 3 |    |   | 0 | 0 | 1