webForumDet fria alternativet

svår SQL-fråga

17 svar · 384 visningar · startad av leancuisine

leancuisineMedlem sedan jan. 2002160 inlägg
#1

Sitter med en uppgift som jag inte hittar en lösning på

här är tabellerna
customers(custno, custname)
exempelvärden (1, 'P Jones'), (2, 'H Chan'), (4, 'S Abdul'),
(6, 'K Smith'), (7, 'N Le Mer')

flights(flightno, destination, day, time, cost)
exempelvärden ('fl2x', 'Paris', 'Tuesday', 1400, 78.85),
('hk101', 'Hong Kong', 'Sunday', 0900, 525.00)
('jx74', 'Baharain', 'Monday', 1300, 275.75)

reservations(custno, flightno)
exempelvärden
(1, 'fl2x'), (1, 'hk101'), (2, 'hk101'), (6, 'jx74'), (7, 'jx74'), (1, 'jx74')

okej, uppgiften är att formulera en SQL-fråga som ger CUSTNAME, FLIGHTNO, DESTINATION för de kunder som har bokat alla tillgängliga flighter.

Svaret blir ju 'P JONES'... Men jag får inte till frågan...

Finns några SQL-genier därute? Jag har suttit i två timmar nu och kommer ingen vart...

LarsGMedlem sedan dec. 200012 464 inlägg
#2
select customer from customers c join reservations r 
on c.custno = r.custno group by customer
having count(distinct flightno) = (select count(*) from flights)
LaspMedlem sedan juli 200012 980 inlägg
#3

Ska det behöva ta så lång tid?? En travestering på Monica Zetterlunds ölhämtarvisa.
Ett bra svar på en bra beskriven fråga. Det är SQL

leancuisineMedlem sedan jan. 2002160 inlägg
#4

Tack för svaret, verkar bra, men jag förstår inte helt syntaxen. Jag vet att det är jobbigt att skriva ut allting, men det är svårt att tolka... t ex finns ju ingen kolumn som heter customer ... vad menade du där :)

Vad avses på de ställen där du skrivit c och r?

Det konstiga är att join-funktionen tas inte upp i den bok jag sitter med, så de har nog tänkt att man ska lösa det på något annat sätt till råga på allt. (Boken är The Essence of Databases av F D Rolland, Prentice Hall)

Tack för försöket i alla fall...

LarsGMedlem sedan dec. 200012 464 inlägg
#5

custname menar jag. Dvs

select custname from customers c join reservations r 
on c.custno = r.custno group by custname
having count(distinct flightno) = (select count(*) from flights)
leancuisineMedlem sedan jan. 2002160 inlägg
#6

Det är aldrig kul att posera i naken okunskap, men jag får det inte att fungera när jag kör en verklig query...

LarsGMedlem sedan dec. 200012 464 inlägg
#7

Vad händer?

leancuisineMedlem sedan jan. 2002160 inlägg
#8

Jag vet inte riktigt vad jag ska skriva på de ställen du skrev c och r, det är nog en förkortning du gjorde väl? Skriver jag rakt upp och ner det du skrev blir det ett felmeddelande...

leancuisineMedlem sedan jan. 2002160 inlägg
#9

lite mer info
mysql> select custname from customers c join reservations r
-> on c.custno = r.custno group by custname
-> having count(distinct flightno) = (select count(*) from flights);
ERROR 1064: You have an error in your SQL syntax near 'on c.custno = r.custno group by custname
having count(distinct flightno) = (sele' at line 2

jag testar både i MySQL och Access där jag lagt upp databasen...

nikoMedlem sedan juni 20022 599 inlägg
#10

MySQL gillar inte subselects, så det är inte konstigt att det inte funkar där.

En variant som åtminstone funkar i Access 2000 är:

SELECT * FROM customers c WHERE NOT EXISTS (
SELECT * FROM flights f WHERE NOT EXISTS (
SELECT * FROM reservations r WHERE r.custno = c.custno AND f.flightno = r.flightno
)
)

LarsGMedlem sedan dec. 200012 464 inlägg
#11

Mysql kan du glömma, det finns inte en chans att få igenom den frågan jag skrev med det begränsade sql-stöd som mysql har. (Porblemet är subselecten.)

Det borde gå bättre i Access. I så fall får du ta bort distinct då access har lite problem med det. Man måste också ange ordet INNER framför join.

select custname from customers c inner join reservations r 
on c.custno = r.custno group by custname
having count(flightno) = (select count(*) from flights)

Om man bara tittar på ditt testdata så har distinct ingen betydelse men det skuller spela roll om samma person kunde göra flera bokningar för samma flight.

c och r är bara förkortningar för tabellnamnen customers och reservations så man slipper skriva ut hela namnet så dom skall vara som dom är.

Jag funderar på en lösning som fungerar i Mysql .

leancuisineMedlem sedan jan. 2002160 inlägg
#12

Nikos svar funkade perfekt! härligt!

Ja, jag märkte att MySQL inte tog subqueries när jag löste de andra uppgifterna jag satt med...

tyvärr så fungerade inte LarsG's lösning i Access, men det beror nog mer på Access än på dig Lars...

Om ni är sugna på mer så är min sista nöt att knäcka

"increase by 50% the cost of all flights for which the customer N Le Mer has made a reservation"

min lösning är denna
UPDATE flights
SET cost= cost*1.5
WHERE flightno
IN (SELECT reservations.flightno FROM reservations, customers
WHERE reservations.custno=customers.custno AND customers.custname='N Le Mer');

men den vill inte riktigt fungera i något av programmen... Teoretiskt sätt tycker jag dock att den verkar perfekt... Vad tycker ni?

nikoMedlem sedan juni 20022 599 inlägg
#13

Vilken version av Access kör du?
BÅDE "min" (egentligen gammalt skolboksexempel) och LarsGs variant funkar i Access 2000.

Din egen lösning på det andra problemet borde också funka utmärkt.

leancuisineMedlem sedan jan. 2002160 inlägg
#14

Jag kör Access 2000 (9.0.3821 SR-1)...

här är den färdiga frågan som jag använder (som ger svaret på den ursprungliga frågan):
SELECT custno, flightno, destination FROM customers, flights
WHERE NOT EXISTS
(SELECT * FROM flights
WHERE NOT EXISTS
(SELECT * FROM reservations
WHERE reservations.custno = customers.custno
AND flights.flightno = reservations.flightno));

Supertack för superhjälpen! :) ;) :P

LarsGMedlem sedan dec. 200012 464 inlägg
#15

Jo din update är det inget fel på. Den fungerar i "min" databas. (Liksom min select med group by och having)

leancuisineMedlem sedan jan. 2002160 inlägg
#16

Mysko, men jag är "happy as Larry" som man säger i England, glad som en Lax med er välsignelse till lösningen...

Kanske skrev jag fel? Fattar inte riktigt vad det beror på. Min PC hoppade nämligen in i American keyboard-modus under tiden jag jobbade, så jag satt med tungan i mungipan och försökte luska fram tecknen... Det är ju bra att det fungerade för er... :) Då finns det hopp för Access (men kanske inte för mig :) )

nikoMedlem sedan juni 20022 599 inlägg
#17

Jag kör Access 2000 (9.0.3821 SR-1)...

Då finns det ju bara en rimlig förklaring kvar:

SQL:er från Uppsala funkar inte i Lund, vilket däremot SQL:er från Malmö gör.. Creepy ;)

leancuisineMedlem sedan jan. 2002160 inlägg
#18

*lol*
ja, det är lite kusligt :)

132 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)