mariakal Δημοσ. 1 Ιουνίου 2010 Δημοσ. 1 Ιουνίου 2010 Για το πιο κάτω σχεσιακό σχήμα: 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 για τη δεύτερη?
Aztec Δημοσ. 1 Ιουνίου 2010 Δημοσ. 1 Ιουνίου 2010 Για το πρώτο με μια πρώτη ματιά μπορεί να γραφτεί και έτσι. Υπάρχουν γενικά διάφοροι τρόποι. >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 κτλ αλλά περισσότερο ήθελα να σου δείξω κάποιες εναλλακτικές σκέψεις
mariakal Δημοσ. 1 Ιουνίου 2010 Μέλος Δημοσ. 1 Ιουνίου 2010 Καταρχή σε ευχαριστώ! Για να καταλάβεις τον προβληματισμό μου σε σχέση με την ενδεικτική λύση που έχω "ανεβάσει", σου λέω τούτο: Αναζητώ λύση χωρίς την χρήση πολύπλοκων συναρτησεων. Είδα όμως και εσυ στη 2 προτείνεις μια λύση με ROWNUMBER...
Aztec Δημοσ. 1 Ιουνίου 2010 Δημοσ. 1 Ιουνίου 2010 Κοίτα την τρίτη λύση. Περισσότερο ήθελα να σου δείξω κάποιες λύσεις που να είναι διαφορετικές απο τον απλό τρόπο σκέψης. Θα μπορούσες να το κάνεις με correlated query με exists αλλά και με κάποιον operator οπως '>' . Βασικά είναι πολλοί οι τρόποι
mariakal Δημοσ. 2 Ιουνίου 2010 Μέλος Δημοσ. 2 Ιουνίου 2010 Στο πιο κάτω παράδειγμα. θεωρώ ότι η σωστή απάντηση είναι "Γ Παπαδοπουλος". Στην ενδεικτικη όμως δίνει "κανενα"!! Μπορεί κάποιος να μου εξηγείσει γιατί? Θεωρείστε τους παρακάτω πίνακες: Ξενοδοχείο Κωδικός_Ξενοδοχείου Επωνυμία_Ξενοδοχείου Τοποθεσία Κατηγορία 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 ?
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.