SQL join ερώτηση

Θοδωρής Λύτρας thlytras at gmail.com
Fri Mar 27 16:34:14 EET 2009


Παιδιά σωστά τα λέτε, κανονικά αυτό θα έπρεπε να μη παίζει στο σχήμα της 
βάσης, ή τουλάχιστον τα όποια κοινά πεδία να έχουν και ίδιες τιμές, ώστε να 
αρκεί ένα NATURAL JOIN.

Δυστυχώς οι πίνακες τους οποίους προσπαθώ να ενώσω είναι έτσι στραβά 
φτιαγμένοι, και επειδή δεν είναι ένας και δύο προσπαθώ να φτιάξω μια 
εφαρμογούλα για να τους συνενώνει σωστά. Και προσπαθούσα να βρω αν υπάρχει 
κάποιος τρόπος να το κάνω αυτόματα, χωρίς να πρέπει να "διαβάσω" τα πεδία και 
των δύο πινάκων και να επιλέξω με το χέρι τα σωστά.

Φαίνεται όμως οτι δεν υπάρχει τέτοια περίπτωση, απ' ότι μου λέτε... Πάντως 
εντύπωση μου κάνει, γιατί το να υπάρχουν συνονόματα πεδία στους πίνακες είναι 
προφανώς ένα ρεαλιστικό σενάριο, και έχει προβλεφθεί (τουλάχιστον από την 
sqlite, υποθέτω και από τις άλλες RDBMS). Βρίσκω περίεργο λοιπόν που δεν 
υπάρχει κάποιο clause να ορίζει το αν θα πρέπει να κρατήσει και τα δύο πεδία 
ή μόνο το ένα.

Θοδωρής

Στις Παρ 27 Μαρ 2009, ο/η Tasos Laskos έγραψε:
> 8a symfoniso me ton George kai sta 2 point tou.
>
> Sostotero 8a itan to mono koino paidio sta 2 table na einai to id me to
> opoio ginete i antistixisi.
>
> George Zarogiannis wrote:
> > Νομίζω ότι όντως ζητάς πολλά από την SQL :)
> >
> > Ο μοναδικός τρόπος που μπορώ να σκεφτώ, υποθέτωντας ότι γράφεις σε
> > κάποια γλώσσα, είναι να διαβάσεις πρώτα τα πεδία των 2 πινάκων και
> > μετά να φτιάξεις δυναμικά το SELECT ώστε να περιέχει κάθε όνομα πεδίου
> > 1 φορά. Το πως θα το κάνεις αυτό, εξαρτάται από τη γλώσσα/βάση που
> > δουλεύεις...
> >
> > πχ ένας τρόπος να δεις τα πεδία ενός table από τη java, ανεξάρτητα
> > βάσης, είναι αυτός
> > <http://www.roseindia.net/jdbc/jdbc-mysql/ColumnName.shtml>
> >
> > Αλλά αυτό που θες μου φαίνεται λίγο περίεργο... μήπως πρέπει να
> > ξανασκεφτείς το σχήμα της βάσης;
> >
> > 2009/3/27 Theodore Lytras <thlytras at gmail.com
> > <mailto:thlytras at gmail.com>>
> >
> >     Έχω μια ερωτησούλα για όποιον ξέρει καλή SQL.
> >     Ψάχνω στον γκούγκλη αλλά άκρη δε βρίσκω....
> >
> >     Έστω οτι έχω δύο πίνακες A και B, με σχέση 1:1 και κοινό πεδίο
> > ονόματι id. Αν θέλω να συνενώσω τους δύο πίνακες, θα δώσω:
> >
> >     SELECT * FROM A, B WHERE A.id = B.id;
> >
> >     ή
> >
> >     SELECT * FROM A INNER JOIN B USING(id);
> >
> >     Το πρόβλημα τώρα προκύπτει στην περίπτωση που υπάρχουν πεδία στον Α
> >     και στον Β με το ίδιο όνομα. Οι δύο προηγούμενες εντολές κρατούν τα
> >     πεδία και των δύο πινάκων (αφού ορίζω SELECT * ), και (τουλάχιστο σε
> >     SQLite που δοκίμασα) τα πεδία του δεύτερου πίνακα μετονομάζονται με
> >     την προσθήκη ενός ":1" στο όνομά τους.
> >
> >     Υπάρχει κάποιος τρόπος να φιλτράρω τα πεδία του δεύτερου πίνακα? Να
> >     του πω δηλαδή να επιλέξει όλα τα πεδία του πρώτου πίνακα, ΣΥΝ όλα τα
> >     πεδία του δεύτερου που δεν υπάρχουν στον πρώτο πίνακα. Βεβαίως αυτό
> > με κάποιο expression, χωρίς δηλαδή να ξέρω εκ των προτέρων τι πεδία
> > υπάρχουν στον ένα και στον άλλο πίνακα.
> >
> >     Υπ'όψιν οτι δε μιλώ για NATURAL JOIN, που (αν τουλάχιστον το κατάλαβα
> >     σωστά) κρατά τις εγγραφές εκείνες εφόσον όλα τα "συνονόματα" πεδία
> >     έχουν ίδιες τιμές. Εγώ θέλω να του ορίζω σαφώς ένα κοινό πεδίο για
> >     INNER JOIN, και από τα υπόλοιπα "συνονόματα" πεδία να κρατά μόνο τις
> >     τιμές που έχει ο ένας πίνακας, ανεξαρτήτως τι έχει ο άλλος πίνακας.
> >
> >     Γίνεται αυτό? Ή ζητώ πολλά από την SQL????
> >
> >     Ευχαριστώ προκαταβολικά,
> >
> >     Θοδωρής


More information about the Linux-greek-users mailing list