sql >> Database >  >> RDS >> Mysql

Duplicaten verwijderen uit resultaat van meerdere joins op tabellen met verschillende kolommen in MySQL

Ik weet niet of ik je probleem begrijp, maar waarom gebruik je een LEFT JOIN? Het verhaal klinkt meer als een INNERLIJKE JOIN. Niets hier vraagt ​​om een ​​UNIE.

[Bewerken] OK, ik denk dat ik nu begrijp wat je wilt. Ik heb nog nooit geprobeerd wat ik ga voorstellen, en bovendien ondersteunen sommige DB's het (nog) niet, maar ik denk dat je een vensterfunctie wilt.

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;

Het idee is om de lijst in zo min mogelijk rijen af ​​te drukken, toch? Dus als A1 10 items heeft in Y en 7 in Z, dan krijgen we 10 rijen met 3 met NULL's voor de Z-velden. Dit werkt in Postgres. Ik geloof niet dat deze syntaxis beschikbaar is in MySQL.

J:

 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

Uitvoer van bovenstaande verklaring:

 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


  1. PHP/MySQL:beste praktijken voor geldtransacties/opslag?

  2. Cross-join in Oracle

  3. Effectieve monitoring van MySQL met SCUMM-dashboards:deel 3

  4. MySQL match() against() - volgorde op relevantie en kolom?