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

Βοηθεια με SQL


Bspus

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

Δημοσ.

Εστω οτι εχω 2 πινακες

 

books:

bookID - number (primary key)

name - varchar2

 

borrowedbooks

bookID - number (foreign key απο τον πρωτο πινακα)

ClientID - number (foreign key απο αλλο πινακα που δεν μας ενδιαφερει)

 

θελω να φτιαξω ενα view που να δειχνει ολες τις εγγραφες απο το books εκτος απο εκεινες που το BookID ειναι ιδιο με καποια εγγραφη στον πινακα borrowedbooks. Δηλαδη να δειχνει μονο τα βιβλια που δεν ειναι δανεισμενα.

 

Μπορει καποιος να με βοηθησει με το select statement?

Ευχαριστω!

Δημοσ.

SELECT b.bookID, b.name FROM books b, borrowedbooks bb

WHERE b.bookID != bb.bookID

Δημοσ.

Το ειχα σκεφτει αυτο αλλα δεν μου δουλευε σωστα οταν το πινακας με τα δανεισμενα ειναι κενος. Τοτε μου βγαζει παντοτε no rows selected. Αν εχει εστω και μια εγγραφη τοτε δουλευει.

Προφανως μπερδευεται με τα null value και δεν μπορει να τα υπολογισει στο where. Νομιζω υπαρχει μια function που το κανει απο null σε κατι αλλο για να το υπολογισω στο where.

Σ'ευχαριστω για τη βοηθεια

Δημοσ.

Δοκίμασε

 

>
select "*" from books where bookID not in (select bookID in borrowedbooks)

 

Χωρίς τα quotes το *.

 

PS. Ρε γμτ, από χθες προσπαθώ να κάνω post και μου πέταει internal server error. Έχω την αίσθηση ότι φταίει το αστεράκι * στο select.

Δημοσ.
Δοκίμασε

 

>
select "*" from books where bookID not in (select bookID in borrowedbooks)

 

Χωρίς τα quotes το *.

 

PS. Ρε γμτ, από χθες προσπαθώ να κάνω post και μου πέταει internal server error. Έχω την αίσθηση ότι φταίει το αστεράκι * στο select.

 

 

Ωραιος cue!

Αυτο δουλευει παντα. Ευχαριστω

Δημοσ.

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

Δημοσ.

Χωρίς nested SQL με inner join.

 

>
select "*" from books left join borrowedbooks on borrowedbooks.bookID = bookID and borrowedbooks.bookID is null

 

Άμα θες να καταλάβεις πως δουλεύουν τα joins διάβασε το άρθρο στο w3schools, SQL Join.

Δημοσ.

 

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. Θα μελετηθει δεοντως

Δημοσ.

Λογικά αυτό πρέπει να σου κάνει:

 

select a.bookID, b.bookID

from books a left outer join borrowedbooks b

on a.bookID = b.bookID

where b.bookID is null

 

θα σου επιστρέψει δύο στήλες (αλλάζεις ανάλογα τα πεδία)

Δημοσ.

Η απάντηση του 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

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

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

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