Gå til innhold

Korleis kjøre self join i eit update statement i MySQL?


Anbefalte innlegg

Skrevet

Prøver å kjøre denne koden, men får det ikkje til å fungere så lenge eg kjører self-join.

 

UPDATE language_text lt1
SET lt1.parent_id = 
(
   SELECT lt2.id
   FROM language_text lt2
   WHERE lt1.text_id = lt2.text_id AND lt2.language = 1
);

 

For å forklare betre så jobber eg med språktabeller, og trengte eit ekstrafelt for å henvise til kva slags tekster som er nøkkeltekster til andre tekster.

F.eks så vil eg at parent_id alltid skal referere til dei engelske tekstane

 

Så norske og svenske tekstar er barn av engelsk.

text_id refererer til tekst objektet, som inneheld tekstane i forskjellige språk, language seier kva slags språk det er. Der 1 = engelsk.

 

id feltet er ein unik id for heile tabellen.

Videoannonse
Annonse
Skrevet

Litt vanskelig å hjelpe når du ikke sier hva som går galt. ;)

 

Hva med å prøve denne syntaxen:

 

update lt1 set parent_id=lt2.id
from language_text lt1
inner join language_text lt2 on lt1.text_id=lt2.text_id and lt2.language=1

Skrevet

God morgen! :)

Eg prøvde en from syntax men etter litt googling så fant eg ut at MySQL ikkje støtta det.

 

Feilmeldinga eg får er:

You can't specify target table 'lt3' for update in FROM clause

Skrevet

Tror ikke UPDATE statementet støtter aliasing av tabellen som skal oppdateres mår syntaxen er slik som dette.

Jeg fjernet alias lt1 og refererte til hele tabellnavnet i subquerien. Da virket det iallefall på SQL Server.

Synd ikke MySQL støtter UPDATE ... FROM, det hadde gjort ting mye enklere.

 

UPDATE language_text 
SET parent_id = 
(
SELECT lt2.id
FROM language_text lt2
WHERE language_text.text_id = lt2.text_id AND lt2.language = 1
);

Skrevet (endret)

Nå fant eg ut av det! Med litt hacking og surr osv. så fungerte denna spørringa

 

UPDATE language_text as lt1
INNER JOIN ( SELECT lt2.id, lt2.text_id
   FROM language_text lt2
) 
AS x on lt1.id = x.id
SET lt1.parent_id = 
(
   SELECT parent_id FROM ( SELECT *
       FROM language_text
   ) AS y
   WHERE y.text_id = x.text_id AND y.language = 1
);

 

Tingen er det at for å kunne utføre self join så må du ha ein ekstra subquery inni subqueryen ;)

Endret av siDDIs

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...