Trädvy Permalänk
Medlem
Plats
tullinge
Registrerad
Nov 2007

SQL Query

Hej!

Försöker lära mig lite SQL och försöker nu lära mig att joina tabeller.
Har fastnat på en uppgift jag skulle vilja lösa, men kommer ingenstans ens med googles hjälp.

Har två st tabeller:

Tabell 1: (Exempelvärden)
ID - Nyckel - Värde
1 - 1 - 10
2 - 2 - 20

Tabell 2:
ID - Nyckel - Typ - A - B
1 - 1 - A - 2 - NULL
2 - 1 - B - NULL - 3
3 - 2 - A - 4 - NULL
4 - 2 - B - NULL - 5

Resultatet jag skulle vilja ha är:

ID - Nyckel - Värde - A - B
1 - 1 - 10 - 2 - 3
2 - 2 - 20 - 4 - 5

Jag vill alltså ha in värdena A och B från tabell 2 till tabell 1. Fält A ska ta värde från tabell 2 om typ är = A. Fält B ska ta värde från tabell 2 om typ är = B.

Om någon har tid att visa mig i rätt riktning så vore det uppskattat!

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Jan 2011

Förutom det sista är det en vanlig join. För att lösa A-B grejen kan du titta på CASE
https://msdn.microsoft.com/en-us/library/ms181765.aspx

Edit: Jag hade missförstått frågan. Kolla mitt svar längre ner för korrekt lösning.

He who hasn't hacked assembly language as a youth has no heart. He who does so as an adult has no brain.
~John Moore

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Okt 2007

SELECT
t1.*,
t2.A,
t2.B
LEFT JOIN t2 ON (t2.nyckel = t1.nyckel)

Om jag inte missförstår ts så borde det inte behövas någon Case when om han inte vill ha värden från a eller b till samma kolumn beroende på typ

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Jan 2011
Skrivet av Zånkt:

SELECT
t1.*,
t2.A,
t2.B
LEFT JOIN t2 ON (t2.nyckel = t1.nyckel)

Om jag inte missförstår ts så borde det inte behövas någon Case when om han inte vill ha värden från a eller b till samma kolumn beroende på typ

Nej det behövs inte, men om det är ett övningsexempel så är det inte alltid att lösningen är den mest optimala eller logiska. Det går att göra det TS beskriver med CASE WHEN om det är exakt det man vill göra.

Hela kolumnen TYP är egentligen onödig eftersom det bara är en av kolumnerna A eller B som innehåller värde.

Edit: Missförstått frågan. Se mitt nästa svar för lösning.

He who hasn't hacked assembly language as a youth has no heart. He who does so as an adult has no brain.
~John Moore

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Jan 2011

Tittade lite mer på frågan och resultatet som man ville få ut. TS vill alltså slå ihop resultatet från 2 rader i tabell 2 med en rad från tabell 1. Jag hade missförstått helt.

SELECT
t1.*,
t2.A,
t3.B
FROM [Tabel 1] t1
JOIN [Tabel 2] t2 On t2.Nyckel = t1.Nyckel
AND t2.Typ = 'A'
JOIN [Tabel 2] t3 On t3.Nyckel = t1.Nyckel
AND t3.Typ = 'B'

He who hasn't hacked assembly language as a youth has no heart. He who does so as an adult has no brain.
~John Moore

Trädvy Permalänk
Medlem
Plats
Stockholms immigrant
Registrerad
Aug 2005

Väldigt bra sida för nybörjare:
http://www.w3schools.com/sql/

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Okt 2007

Jag såg dock att nyckel i t2 inte var unik. Det hade jag missat.

Jag hade då löst det genom att gruppera resultatet och använda max på a och b
Annars kan man gruppera t2 i en subquery när man joinar in den
Left join (select * from t2 group by nyckel) on (osv)

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Jan 2011

@Zånkt:
Det är snyggare och bättre ur prestandaperspektiv. Jag tror nog att min lösning är lättare att ta till sig som nybörjare.

He who hasn't hacked assembly language as a youth has no heart. He who does so as an adult has no brain.
~John Moore

Trädvy Permalänk
Medlem
Plats
tullinge
Registrerad
Nov 2007

Tack så mycket för era svar!
Körde på nedan lösning vilket fungerade bra, men ska kika på dom andra alternativen också.

SELECT
t1.*,
t2.A,
t3.B
FROM [Tabel 1] t1
JOIN [Tabel 2] t2 On t2.Nyckel = t1.Nyckel
AND t2.Typ = 'A'
JOIN [Tabel 2] t3 On t3.Nyckel = t1.Nyckel
AND t3.Typ = 'B'

Enda problemet jag har är att nyckeln måste finnas i båda tabellerna för att den ska komma med. Och i tabell 2 måste den både ha en A post och en B post. Skulle vilja att A och B blev NULL om inget hittas.

EDIT: det löste jag snabbt genom att köra på left join istället.