Just nu i M3-nätverket
Gå till innehåll

Söker SELECT-sats som presenterar 1-många relation på en rad


hummel2

Rekommendera Poster

Hej!

 

Jag skulle behöva skriva en SELECT som används för att exportera tabellinformation till ett excel-ark.

 

Situationen

Tabell 1, Föräldrar:

fID, bNamn

 

Tabell 2, Barn

bID, fID, bNamn

 

Jag vill att frågan ska ge kolumnerna:

fID, fNamn, bNamn1, bNamn2, bNamn3, bNamn4, bNamn5

 

Problemet ligger alltså i att få föräldrarnas barn att listas på samma rad som föräldern (inte som i enkel JOIN där det blir 5 rader utifall att föräldern har 5 barn....)

 

Någon som har ett bra förslag?

 

 

 

Mer info: Access-databas. Exporten sker från web-applikation i ASP.NET 2.0. Läser alltså in resultatet till en DataTable.

 

Länk till kommentar
Dela på andra webbplatser

Du kanske skulle kunna skriva något i stil med:

 

SELECT fID, fNamn, (SELECT bNamn FROM Tabell2 WHERE Tabell2.fID = Tabell1.fID) As Barn FROM Tabell1

 

Inte direkt speciellt optimerad kod, sen kan jag inte testa lösningen heller då jag inte har SQL installerat här.

 

Det är möjligt att du får många rader endå, isf. vete sjutton hur du skall göra.

 

 

 

[inlägget ändrat 2006-09-26 10:54:41 av Loverman]

Länk till kommentar
Dela på andra webbplatser

Hej, tack för ditt svar.

 

Jo det är nog så att en liknande syntax är omöjlig eftersom underfrågan kan returnera upp till 5 rader.

 

Jag har funderat i banor som (snabb syntax nu..):

 

SELECT id, föräldrar,(SELECT TOP 1 barn...WHERE barn.fid=forälder.id), (SELECT TOP 2 'fast BARA nr2' barn...), (SELECT TOP 3 'fast bara 3'...) FROM föräldrar

 

men kört fast...

 

Länk till kommentar
Dela på andra webbplatser

Precis den lösningen jag var inne på också, men jag tror han returnerar flera rader endå. Dessutom hämtar TOP 3, 3 rader, inte rad nr 3.

 

Kanske finns någon LIMIT funktion i Access som i MYSQL där du kan hämta 1 rad från och med rad 4 osv.

 

Du kan inte köra 2 SELECT-satser då? Och bara göra om recordsettet till en sträng? Tror inte overheaden blir så farlig.

 

Lösningen kanske inte är den bästa dock

 

Länk till kommentar
Dela på andra webbplatser

Hej och tack igen.

 

Det är exakt en sådan LIMIT-funktionalitet jag söker efter, men inte hittar...

 

Då hade jag ju kunnat lösa det hela med TOP 1, TOP 2, TOP3 osv och limitera resultatet till en rad varje gång...

 

Får eventuellt kika på en lösning där jag istället skapar dessa kolumner programmatiskt i ASP.NET-applikationen. Läser då in tabellerna separat och skapar 5 nya kolumner i Föräldratabellens DataTable och sedan på något sätt kopierar över data till denna från Barntabellen...

 

Länk till kommentar
Dela på andra webbplatser

Här är LIMIT-syntaxen för MYSQL, du kanske kan testa den om Access har stöd för det:

 

SELECT * FROM Tabell ORDER BY TabllID DESC LIMIT 2,1

 

LIMIT är inte "LIMIT start,slut" utan är "LIMIT start,hur-många-rader"

 

Länk till kommentar
Dela på andra webbplatser

Hej,

Jo jag hittade LIMIT-syntaxen , men Access har inte stöd för den tyvärr..

 

Nåja, jag får lösa det på annat sätt... Kommer du på nåt så fortsätt hojta till. Tack :)

 

Kanske en funktion GetBarn(föräldraID) som returnerar en sträng med alla förälderns barn...

Får anropa den för varje förälder och lägga resultatet i en ny kolumn i DataTablen som innehåller föräldradata..

:/

 

 

 

Hittade nu faktiskt en lite omständig lösning ... Den här funkar :)

SELECT id, p.namn, (SELECT TOP 1 b.namn FROM tblBarn b WHERE b.pren_id = p.id) As Barn1, (SELECT TOP 1 b1.namn FROM tblBarn b1 WHERE b1.pren_id = p.id AND b1.id > (SELECT TOP 1 b2.id FROM tblBarn b2 WHERE b2.pren_id = p.id)) As Barn2,
(SELECT TOP 1 b4.namn FROM tblBarn b4 WHERE b4.pren_id = p.id AND b4.id > (SELECT TOP 1 b5.id FROM tblBarn b5 WHERE b5.pren_id = p.id AND b5.id > (SELECT TOP 1 b6.id FROM tblBarn b6 WHERE b6.pren_id = p.id))) AS Barn3
FROM tblPrenumeranter p

[inlägget ändrat 2006-09-26 13:22:58 av hummel2]

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...