Jag har en databas med ett antal tabeller som hanterar produktinformation i form av datablad. Jag har ett system för att relatera produktrubriker i en söksida. En produktgrupp kan ha flera datablad vilket gör att selecten nedan plockar ut dubletter av ISId. Jag får ingen fason på selecten. Help me, jag vill alltså inte ha några dubletter av ISId.
SELECT pgn.prodGrpNamnid, pgn.prodNamn as prodNamn,
ins.ISprodNamn AS ISprodNamn, ins.bild as bild, ins.ISId as ISId,
d.dbId as dbId, d.dbNamn as dbNamn, s.sprakKod as sprakKod,
isr.rubrik as rubrik, isr.farg as farg
FROM ProduktGruppsNamn pgn, ProduktGruppsRelation pgr, InternetSoksida ins,
InternetSoksidaRubrik isr, Datablad d, Sprak s
WHERE pgn.prodGrpNamnId = ins.prodGrpNamnId
AND pgn.prodGrpNamnId = d.prodGrpNamnId
AND pgn.prodId = pgr.prodId AND pgr.tradNr = 1
AND ins.ISRId = isr.ISRId
AND d.internet = 1
AND d.internetStartDb = 1
AND pgn.sprakId = s.sprakId
AND ins.ISRId = 1
ORDER BY pgr.l
LarsGMedlem sedan dec. 200012 465 inlägg Vill du visa ett datablad per produktgrupp även om det finns flera? Vad är problemet annars?
Exemplifiera med vad du får nu och vad du vill ha.
Detta är söksida där jag vill visa rubrik på databladet och en bild kopplad till databladet. Om jag har flera datablad under en produktgrupp så kommer jag inte att kunna välja vilken bild som ska visas till nr2,3 osv. ISId är egentligen ett unikt radnummer för varje produktgrupp på en söksida. Men med min SQL så kan det bli dubletter av ISId pga att det då finns många datablad under en produktgrupp. Oj, är detta krångligt att förstå.
Rader kan se ut så här:
prodGrpNamnId - prodNamn - ISprodNamn - bild - ISId - dbId
16 - Std krok - NULL - ..... - 15 - 1148
16 - Std krok - NULL - ..... - 15 - 77
42 - Spec... - NULL - ..... - 16 - 43
154 - Klämma - NULL - ..... - 30 - 150
Glömde säga att MSSql används. :-)
LarsGMedlem sedan dec. 200012 465 inlägg 16 - Std krok - NULL - ..... - 15 - 1148
16 - Std krok - NULL - ..... - 15 - 77
Vilken av dessa rader vill du ha då?
Jag vill ha den första. Egentligen spelar det ingen roll för om den ena inte finns så kan jag lägga upp den med ett nytt ISId.
LarsGMedlem sedan dec. 200012 465 inlägg Du kan inte använda begreppet första. Du kan bara säga att du t.ex. vill ha den med högsta dbid
SELECT
pgn.prodGrpNamnid,
pgn.prodNamn,
ins.ISprodNamn,
ins.bild,
ins.ISId,
max( d.dbId) as dbId,
d.dbNamn,
s.sprakKod,
isr.rubrik,
isr.farg,
pgr.l
FROM ProduktGruppsNamn pgn,
ProduktGruppsRelation pgr,
InternetSoksida ins,
InternetSoksidaRubrik isr,
Datablad d,
Sprak s
WHERE pgn.prodGrpNamnId = ins.prodGrpNamnId
AND pgn.prodGrpNamnId = d.prodGrpNamnId
AND pgn.prodId = pgr.prodId
AND pgr.tradNr = 1
AND ins.ISRId = isr.ISRId
AND d.internet = 1
AND d.internetStartDb = 1
AND pgn.sprakId = s.sprakId
AND ins.ISRId = 1
group by pgn.prodGrpNamnid,
pgn.prodNamn,
ins.ISprodNamn,
ins.bild,
ins.ISId,
d.dbNamn,
s.sprakKod,
isr.rubrik,
isr.farg
pgr.l
ORDER BY pgr.l
Jag menade första av de 2 alternativ du skrev.
Din sql ger i stort sätt samma resultat, ordningen är annorlunda men lika många poster. Fortfarande dubletter av ISId. Måste man inte ha något slags vilkor på aggregatet (max(d.dbId)). Typ HAVING... jag har testat en del utan resultat...vill helst inte blanda in logik utanför sql'n.
LarsGMedlem sedan dec. 200012 465 inlägg SELECT
pgn.prodGrpNamnid,
pgn.prodNamn,
ins.ISprodNamn,
ins.bild,
ins.ISId,
d.dbId,
d.dbNamn,
s.sprakKod,
isr.rubrik,
isr.farg
FROM ProduktGruppsNamn pgn,
ProduktGruppsRelation pgr,
InternetSoksida ins,
InternetSoksidaRubrik isr,
Datablad d,
Sprak s
WHERE pgn.prodGrpNamnId = ins.prodGrpNamnId
AND pgn.prodGrpNamnId = d.prodGrpNamnId
AND pgn.prodId = pgr.prodId
AND pgr.tradNr = 1
AND ins.ISRId = isr.ISRId
AND d.internet = 1
AND d.internetStartDb = 1
AND pgn.sprakId = s.sprakId
AND ins.ISRId = 1
and d.dbid in (
select max(dbid)
from datablad d2
where pgn.prodGrpNamnId = d2.prodGrpNamnId
AND d2.internet = 1
AND d2.internetStartDb = 1 )
ORDER BY pgr.l
Wooouw...dä funka! Tack Lars G! :e
Man lär sig alltid något nytt. Jag trodde inte man kunde använda tabell som används utanför subquery inuti subquery, "pgn.prodGrpNamnId" nedan.
(
select max(dbid)
from datablad d2
where pgn.prodGrpNamnId = d2.prodGrpNamnId
AND d2.internet = 1
AND d2.internetStartDb = 1 )
Det gick upp ett liljeholmens för mig. Är det generellt så i SQL-standarder?