SQL-fråga
Två tabeller; den första innerhåller artiklar (i exemplet visat som bokstäver), den andra innehåller underartiklar (i exemplet visat som siffror). Tabellerna är joinade genom att varje underartikel håller reda på sin artikel. Nedan ser vi relationerna hos tre artiklar. Artikel A innehåller alltså underartiklar 1, 2 och 3, artikel B innehåller 2 och 3, och C innehåller 1 och 3.
A-1
A-2
A-3
B-2
B-3
C-1
C-3
Nu vill jag hämta de artiklar som INTE innehåller underartikel 1 (alltså ska bara B hämtas). Hur ser SQL-frågan ut då?
Svara
Sv: SQL-fråga
Hej!
Ett förslag:
SELECT a.artikelnamn, b.artikelnummer FROM artiklar a INNER JOIN underartiklar b ON b.id = a.id AND b.artikelnummer <> 1
//Håkan
Svara
Sv:SQL-fråga
Tack Håkan. Så enkelt var det alltså. Missade att villkoret skulle in i JOIN istället för i WHERE.
Svara
Sv: SQL-fråga
Det hade gått utmärkt att lägga villkoret <b>(AND b.artikelnummer <> 1)</b> i WHERE-satsen också.
En ren smaksak.
//Håkan
Svara
Sv:SQL-fråga
Hmm... vid närmare eftersyn visar det sig att det inte var rätt svar ändå. Nu blir resultatet:
A-2
A-3
B-2
B-3
C-3
Det enda som plockas bort är posterna med 1. Alltså hämtas även artiklarna A och C fast de innehåller underartikel 1. Vad jag vill ha är bara resultatet:
B
Svara
Sv: SQL-fråga
Jahhhaaaa...
Vi gör ett nytt fösök.
<code>SELECT CASE b.artikelnummer WHEN 1 THEN a.artikelnamn
ELSE a.artikelnamn + '-' + b.artikelnummer END FROM artiklar a
INNER JOIN underartiklar b ON b.id = a.id</code>
Om artikelnummer är t.ex. en int får du göra en CAST
//Håkan
Svara
Sv: SQL-fråga
Trolien inte det bästa och effektivaste/snyggaste sättet att göra det på men detta borde fungera.
<code>
SELECT a.artikelnamn, b.artikelnummer FROM artiklar a
INNER JOIN underartiklar b ON b.id = a.id
WHERE a.artikelnamn NOT IN
(SELECT a.artikelnamn FROM artiklar a
INNER JOIN underartiklar b ON b.id = a.id
WHERE b.artikelnummer = 1)
</code>
Svara
Sv:SQL-fråga
Njjaaa Thomas.
Du har nog bara gjort en variant av mitt tidigare svar.
EDIT: kan ha läst fort och fel, strunt a i detta i såfall.
//Håkan
Svara
Sv: SQL-fråga
Nja Håkan, min variant skall ta alla artiklar där artikeln inte har en underartikel med artikelnummer 1. Om du tittar på vad som efterfrågas är det så att alla artiklar som har en underartikel med artikelnummer 1 INTE skall tas med. Din variant lämnar bort alla rader där underartikelns artikelnummr är 1 men lämnar kvar alla artiklar. Han vill ha ut artikel B från A B och C eftersom A har underartiklarna 1, 2 och 3, B har inte ett och C har 1 och 3.
Svara
Sv: SQL-fråga
<code>
SELECT a.artikelnamn, b.artikelnummer
FROM artiklar a inner join underartiklar b
ON b.id = a.id
WHERE NOT exists
(SELECT *
from underartiklar ua
where ua.id = a.id
and ua.artikelnummer = 1)
</code>
Svara
Sv:SQL-fråga
Jag fattade frågan fel först, och gav ett nytt förslag.
I ditt förslag så får han ju inte med artikelnamnet när artikelnumret är 1.
Vilket visade sig senare vara det han ville.
//Håkan
Svara
Sv:SQL-fråga
EDIT: Idag läser jag visst bara fort och fel... :-(
Jag har helt missat frågeställningen, och givit svar på något helt annat.
Mats och Thomas kan bortse från allt som jag skrivit i tråden, bara att ta hâlja istället.
PS: Håller med Lars Berg <b>EXISTS</b> ger bättre prestanda än att använda <b>IN</b> DS.
//Håkan
Svara