Προς το περιεχόμενο

άσκηση sql


mariakal

Προτεινόμενες αναρτήσεις

Δημοσ.

Για το πιο κάτω σχεσιακό σχήμα:

Artists (artistID, name)

SimilarArtists (artistID, simArtistID, weight)

/* όπου weight είναι ο βαθμός ομοιότητας δύο καλλιτεχνών */

Albums (albumID, artistID, name)

Tracks (trackID, artistID, name, length)

TrackLists (albumID, trackID, trackNum)

 

έχω δυο ερωτήσεις απαντημένες αλλά δεν τις πολυκαταλαβαίνω. Μήπως μπορεί κάποιος να τις γράψει με αλλο τρόπο, πιο απλό?

 

Συγκεκριμένα:

1-Βρείτε τα ονόματα των καλλιτεχνών που ταιριάζουν περισσότερο (είναι πιο ‘όμοιοι’) στη Μadona από τη Lagy Gaga

 

SELECT A.name AS name

FROM Artists A, Artists A2, SimilarArtists S

WHERE ((A.artistID = S.artistID AND A2.artistID = S.simArtistID) OR (A.artistID = S.simArtistID AND A2.artistID = S.artistID)) AND A2.name = 'Madona' AND NOT EXISTS

(SELECT *

FROM Artists A3, SimilarArtists S2

WHERE ((A.artistID = S2.artistID AND A3.artistID = S2.simArtistID) OR (A.artistID = S2.simArtistID AND A3.artistID = S2.artistID)) AND A3.name = 'Lady Gaga' AND S2.weight >= S.weight);

 

 

2- Για όλα τα Albums, δώστε το όνομά τους και το όνομα του 18ου τραγουδιού (track). Αν το Album δεν έχει 18ο τραγούδι, δώστε το κενό ως όνομα τραγουδιού.

 

select A.name as album_name, T.name as track_name

from Albums A

LEFT OUTER JOIN

(select T2.albumid, T1.name from tracks T1, tracklists T2

where T1.trackid = T2.trackid and T2.tracknum=18) as T

on A.albumid = T.albumid;

 

Με λίγα λόγια, πρέπει οπωσδηποτε να χρησιμοποιήσω AND NOT EXISTS για την πρώτη και LEFT OUTER JOIN για τη δεύτερη?

Δημοσ.

Για το πρώτο με μια πρώτη ματιά μπορεί να γραφτεί και έτσι. Υπάρχουν γενικά διάφοροι τρόποι.

 

>SELECT A.name AS name
FROM Artists A,
        (select S.artistid as artist ,S.weight as weight from Artists B , SimilarArtists S where  
                    S.simartistid=B.artistid and B.name ='Madona') madona,
        (select P.artistid as artist ,P.weight as weight from Artists K , SimilarArtists P where  
                    P.simartistid=K.artistid and K.name ='Lady Gaga') lady
where A.artistid=madona.artist
and A.artistid=lady.artist
and madona.weight >  lady.weight

 

Άλλο ένα

 

>
select name from (
                    SELECT A.name AS name,
                    A2.name AS simname,
                   [b] ROWNUMBER() over (partition by A.artistid  order by weight desc)  AS rown[/b]
                   FROM Artists A, Artists A2, SimilarArtists S
                   where A.artistid = S.artistid
                   and S.simartistid = A2.artistid
                   and A2.name in ('Madona', 'Lady Gaga')
                   )
where rown=1 and simname ='Madona'  

 

Μπορεί να έχει κάποια λάθη καθώς το έγραψα τελείως στον αέρα . Προσπάθησε να πιάσεις το νόημα. Θα σκεφτώ και καναν άλλο και θα ποστάρω.

 

---------- Προσθήκη στις 20:43 ---------- Προηγούμενο μήνυμα στις 19:59 ----------

 

Επίσης

 

> SELECT A.name AS name
                   FROM Artists A, Artists A2,Artists A3, SimilarArtists S,SimilarArtists K
                    where A.artistid = S.artistid
                    and S.simartistid = A2.artistid
                    and A2.name='Madona'
                    and A.artistid=K.artistid
                    and K.simartist=A3.artistid
                    and A3.name='Lady Gaga'
                    and S.weight > K.weight  

 

Τέλος μπορεί να γίνει κλασικά με correlated query είτε με < είτε με not exists exists κτλ αλλά περισσότερο ήθελα να σου δείξω κάποιες εναλλακτικές σκέψεις

Δημοσ.

Καταρχή σε ευχαριστώ!

:-)

Για να καταλάβεις τον προβληματισμό μου σε σχέση με την ενδεικτική λύση που έχω "ανεβάσει", σου λέω τούτο:

Αναζητώ λύση χωρίς την χρήση πολύπλοκων συναρτησεων. Είδα όμως και εσυ στη 2 προτείνεις μια λύση με ROWNUMBER...

Δημοσ.

Κοίτα την τρίτη λύση. Περισσότερο ήθελα να σου δείξω κάποιες λύσεις που να είναι διαφορετικές απο τον απλό τρόπο σκέψης. Θα μπορούσες να το κάνεις με correlated query με exists αλλά και με κάποιον operator οπως '>' . Βασικά είναι πολλοί οι τρόποι :-)

Δημοσ.

Στο πιο κάτω παράδειγμα. θεωρώ ότι η σωστή απάντηση είναι "Γ Παπαδοπουλος". Στην ενδεικτικη όμως δίνει "κανενα"!!

Μπορεί κάποιος να μου εξηγείσει γιατί?

 

Θεωρείστε τους παρακάτω πίνακες:

Ξενοδοχείο

Κωδικός_Ξενοδοχείου Επωνυμία_Ξενοδοχείου Τοποθεσία Κατηγορία

101 Hilton Αθήνα 1

102 Rio Πάτρα 3

105 Hyatt Θεσσαλονίκη 2

Πελάτης

Κωδικός_Πελάτη Όνομα_Πελάτη Τηλέφωνο

C1 Γιώργος Παπαδόπουλος 2310234530

C2 Μαρία Περικλέους 2631078654

C3 Κώστας Σταύρου 2392029955

Κράτηση

Κωδικός_Κράτησης Κωδικός_Πελάτη Κωδικός_Ξενοδοχείου Ημερομηνία Τιμή

R1001 C3 101 5/8/2007 – 12/8/2007 800

R1002 C1 102 13/8/2007-16/8/2007 400

R1003 C2 105 1/9/2007-2/7/2007 100

 

Τι θα επιστρέψει η εκτέλεση του παρακάτω SQL ερωτήματος;

 

SELECT Όνομα_Πελάτη

FROM Ξενοδοχείο, Πέλατης, Κράτηση

WHERE (Πελάτης.Κωδικός_Πελάτη=Κράτηση.Κωδικός_Πελάτη) AND (Κράτηση.Κωδικός_Ξενοδοχείου=Ξενοδοχείο.Κωδικός_Ξενοδοχείου)

AND (Ξενοδοχείο.Κατηγορία > 3)

 

---------- Προσθήκη στις 11:44 ---------- Προηγούμενο μήνυμα στις 11:43 ----------

 

Μήπως επειδη δίνει >3 και οχι >=3 ?

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...