webForumDet fria alternativet

Hjälp med att förbättra SQL-sats

Databaser & SQLur Databashanterare & SQL

0 svar · 1 031 visningar · startad av Icehowl

IcehowlMedlem sedan mars 20111 inlägg
#1

Hej, jag har en relation som ser ut som följande:

http://www.datorpulsen.se/other/relation.jpg

Jag vill få ut namnet på alla personer (tabell Person) som har bott i samtliga hotell (tabell Hotell) på en viss ort. Tex: om det finns 2 hotell i Berlin vill jag hämta namnen på de som har bott i båda hotellen. Vilken ort det rör sig om är förbestämt (se mitt exempel längre ner, där jag valde berlin).

Vet inte om det är till någon hjälp men samtliga nycklar är int värden och ort är en sträng.

Jag har visserligen fått resultatet jag vill ha med följande SQL-sats:

SELECT resande.person
FROM (SELECT COUNT(hotellid) AS maxAntal, Hotell.ort AS ort FROM Hotell GROUP BY Hotell.ort)  AS [max], (SELECT DISTINCT Person.namn AS person, COUNT(Hotell.hotellid) AS antal, Hotell.ort AS ort
FROM Hotell INNER JOIN (Person INNER JOIN (Medresenär INNER JOIN HotellBokning ON Medresenär.bokningsnummer = HotellBokning.bokningsnr) ON Person.personnr = Medresenär.personnr) ON Hotell.hotellid = HotellBokning.hotellid
WHERE (((Hotell.ort)='Berlin')) GROUP BY Person.namn, Hotell.ort)  AS resande
WHERE (((max.maxAntal)=[resande].[antal]) AND ((max.ort)=[resande].[ort]));

men den är för krånglig och det ska tydligen finnas ett lättare sätt. Vad den gör är att den räknar antalet hotell som finns på den angivna orten (i det här fallet 'Berlin') och sen jämför den med antalet (unika) hotell personerna har bott i. Om båda värden är den samma så betyder det att de har bott i samtliga hotell i den staden.

SQL-satsen ska funka i Access och MySQL.

Någon som kan hjälpa mig med det?
Tack i förväg.

126 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)