Bspus Δημοσ. 3 Φεβρουαρίου 2007 Δημοσ. 3 Φεβρουαρίου 2007 Εστω οτι εχω 2 πινακες books: bookID - number (primary key) name - varchar2 borrowedbooks bookID - number (foreign key απο τον πρωτο πινακα) ClientID - number (foreign key απο αλλο πινακα που δεν μας ενδιαφερει) θελω να φτιαξω ενα view που να δειχνει ολες τις εγγραφες απο το books εκτος απο εκεινες που το BookID ειναι ιδιο με καποια εγγραφη στον πινακα borrowedbooks. Δηλαδη να δειχνει μονο τα βιβλια που δεν ειναι δανεισμενα. Μπορει καποιος να με βοηθησει με το select statement? Ευχαριστω!
Επισκέπτης Δημοσ. 3 Φεβρουαρίου 2007 Δημοσ. 3 Φεβρουαρίου 2007 SELECT b.bookID, b.name FROM books b, borrowedbooks bb WHERE b.bookID != bb.bookID
Bspus Δημοσ. 4 Φεβρουαρίου 2007 Μέλος Δημοσ. 4 Φεβρουαρίου 2007 Το ειχα σκεφτει αυτο αλλα δεν μου δουλευε σωστα οταν το πινακας με τα δανεισμενα ειναι κενος. Τοτε μου βγαζει παντοτε no rows selected. Αν εχει εστω και μια εγγραφη τοτε δουλευει. Προφανως μπερδευεται με τα null value και δεν μπορει να τα υπολογισει στο where. Νομιζω υπαρχει μια function που το κανει απο null σε κατι αλλο για να το υπολογισω στο where. Σ'ευχαριστω για τη βοηθεια
Cue Δημοσ. 4 Φεβρουαρίου 2007 Δημοσ. 4 Φεβρουαρίου 2007 Δοκίμασε > select "*" from books where bookID not in (select bookID in borrowedbooks) Χωρίς τα quotes το *. PS. Ρε γμτ, από χθες προσπαθώ να κάνω post και μου πέταει internal server error. Έχω την αίσθηση ότι φταίει το αστεράκι * στο select.
Bspus Δημοσ. 4 Φεβρουαρίου 2007 Μέλος Δημοσ. 4 Φεβρουαρίου 2007 Δοκίμασε > select "*" from books where bookID not in (select bookID in borrowedbooks) Χωρίς τα quotes το *. PS. Ρε γμτ, από χθες προσπαθώ να κάνω post και μου πέταει internal server error. Έχω την αίσθηση ότι φταίει το αστεράκι * στο select. Ωραιος cue! Αυτο δουλευει παντα. Ευχαριστω
Επισκέπτης Δημοσ. 4 Φεβρουαρίου 2007 Δημοσ. 4 Φεβρουαρίου 2007 Kanonika 8a eprepe na douleuei kai to query pou sou edwsa akoma k otan einai adeios o pinakas kai apla na min epistrefei tipota. select "*" from books where bookID not in (select bookID in borrowedbooks) Auto einai nested sql query kai pi8anos na min doulepsei se merikous sql servers (px mysql <= 4.0.x) Dokimase k auto: SELECT b.bookID, b.name FROM books b, borrowedbooks bb WHERE b.bookID != bb.bookID AND b.bookID IS NOT NULL
Cue Δημοσ. 5 Φεβρουαρίου 2007 Δημοσ. 5 Φεβρουαρίου 2007 Χωρίς nested SQL με inner join. > select "*" from books left join borrowedbooks on borrowedbooks.bookID = bookID and borrowedbooks.bookID is null Άμα θες να καταλάβεις πως δουλεύουν τα joins διάβασε το άρθρο στο w3schools, SQL Join.
Bspus Δημοσ. 5 Φεβρουαρίου 2007 Μέλος Δημοσ. 5 Φεβρουαρίου 2007 Dokimase k auto: SELECT b.bookID, b.name FROM books b, borrowedbooks bb WHERE b.bookID != bb.bookID AND b.bookID IS NOT NULL το δοκιμασα ετσι οπως το λες αλλα και με bb.bookID IS NOT NULL (αυτο θα ηταν πιο σωστο αφου μονο ο πινακας με τα δανεισμενα μπορει να ειναι κενος) Παντως παλι τα ιδια και στις 2 περιπτωσεις. Οταν τα δανεισμενα ειναι κενος δεν επιστρεφει τιποτα Το προγραμμα θα τρεξει σε oracle 10g οποτε με τα nested δεν υπαρχει προβλημα. Cue πολυ καλο φαινεται το tutorial. Θα μελετηθει δεοντως
Elric_The_Melnibonian Δημοσ. 6 Φεβρουαρίου 2007 Δημοσ. 6 Φεβρουαρίου 2007 select "*" from books b where b.bookID not in (select bookID from borrowedbooks) and b.booksID is not nul αυτό δεν κάνει αυτό που θες ?
vmakrin Δημοσ. 6 Φεβρουαρίου 2007 Δημοσ. 6 Φεβρουαρίου 2007 Λογικά αυτό πρέπει να σου κάνει: select a.bookID, b.bookID from books a left outer join borrowedbooks b on a.bookID = b.bookID where b.bookID is null θα σου επιστρέψει δύο στήλες (αλλάζεις ανάλογα τα πεδία)
Cue Δημοσ. 6 Φεβρουαρίου 2007 Δημοσ. 6 Φεβρουαρίου 2007 Η απάντηση του vmakrin είναι η ίδια στην ουσια με το join που έγραψα. (εκ παραδρομής έγραψα inner αντί για outer στην εκφώνηση) Στο συντακτικό μέρος δεν έχει διαφορά το left outer join (ANSI 92 standard syntax) από σκέτο left join. Απλά επειδή το default join όταν βάζουμε σκέτο equality μεταξύ δύο columns είναι το λεγόμενο inner, εξού και το outer για να ξεχωρίζει. (αν και τα left/right προϋποθέτουν outer join) π.χ. > SELECT "*" FROM books b, borrowedbooks bb WHERE b.bookID = bb.bookID γράφεται και > SELECT "*" FROM books INNER JOIN borrowedbooks bb WHERE bookID = bb.bookID
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.