Match ongerelateerde tabellen (MySQL)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

Het klinkt als een oxymoron, maar soms wil ik records in ongerelateerde tabellen 1-op-1 matchen.

Voorbeeld: EAN-codes toekennen aan producten

  • Tabel tmp1 met 100 nieuwe producten
  • Tabel tmp2 met 100 beschikbare EAN-nummers
  • Ik wil deze tabellen 1-op-1 matchen, zodat elk product een EAN-number krijgt

Join zonder conditie?

Leuk bedacht, maar een join zonder conditie, is niet de oplossing:

select
   *
from
   tmp1
join
   tmp2

Dit genereert het Cartesiaanse product van de twee tabellen met 10.000 rijen in totaal.

Join zonder join?

Nog leuker bedacht, maar ook dit geeft een Cartesiaans product:

select
   *
from
   tmp1,
   tmp2

En dit vaart al niet beter:

select distinct
   *
from
   tmp1,
   tmp2
group by
   tmp1.sku_b3,
   tmp2.ean;

Cross join?

Ook niet (al of niet met distinct of group by:

select
   *
from
   tmp1
cross join
   tmp2

Volgnummer invoegen

Deze oplossing heb ik sinds 2016 regelmatig gebruikt. Ik vind 'm nog steeds wat omslachting, maar het werkt wel:

  1. Maak van beide tabellen een tijdelijk kopie, waarvan je de records wil matchen (dus alle rijen van producten waar een EAN-nummer aan moet worden toegevoegd, en evenveel rijen uit de EAN-tabel met beschikbare EAN-nummers)
  2. Voeg aan beide tabellen een pk-kolom toe die zichzelf nummert vanaf 1
  3. Match de tabellen op pk-nummer & wissel data uit
  4. Gebruik deze twee tijdelijke tabellen om de achterliggende brontabellen bij te werken.

Zie ook

Bronnen