Permalänk
Medlem

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!

Permalänk
Medlem

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.

Visa signatur

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

Permalänk
Medlem

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

Permalänk
Medlem
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.

Visa signatur

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

Permalänk
Medlem

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'

Visa signatur

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

Permalänk
Medlem

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

Permalänk
Medlem

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)

Permalänk
Medlem

@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.

Visa signatur

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

Permalänk
Medlem

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.