Getting Started: Writing T-SQL (Part 5)
Fivi Panopoulou - Sotiris Karras
Σε αυτό το post θα δούμε τον operator join. Με αυτόν θα μπορέσουμε να συνδυάσουμε πληροφορίες από περισσότερους του ενός πίνακες στο result set μας. O συγκεκριμένος τελεστής χρησιμοποιείται στο FROM clause και συνδέει δύο πίνακες. Ο ένας πίνακας είναι συντακτικά πριν τον τελεστή και συνεπώς λέμε ότι αυτός είναι ο αριστερός πίνακας και ο άλλος ακολουθεί αμέσως μετά τον τελεστή και έτσι είναι ο δεξής πίνακας. Έχουμε τρείς βασικούς τύπους join, το cross join, το inner join και το outer join.
CROSS JOIN
Με το cross join παίρνουμε το καρτεσιανό γινόμενο των δύο πινάκων. Κάθε γραμμή του πρώτου πίνακα συνδυάζεται με κάθε γραμμή του δεύτερου πίνακα. Το πλήθος των γραμμών του αποτελέσματος είναι ο αριθμός γραμμών του πρώτου πίνακα επί τον αριθμό γραμμών του δεύτερου πίνακα. Για παράδειγμα, έστω ότι θέλουμε να δούμε πώς θα ήταν ο συνδυασμός όλων των υπαλλήλων με όλων των περιοχών. Αυτό μπορούμε να το δούμε με το Query 1 το οποίο θα μας επιστρέψει 477 γραμμές, οι οποίες προκύπτουν από τον συνδυασμό των 9 υπαλλήλων με τις 53 περιοχές.
-- QUERY 1: CROSS JOIN - EmployeeTerritories SELECT EmployeeID,TerritoryIDFROM EmployeesCROSS JOIN TerritoriesGO
INNER JOIN
To inner join είναι ο τύπος που χρησιμοποιείται πιο συχνά. Για αυτό, αν δεν προσδιοριστεί ο τύπος του join, υπονοείται το inner join. Αυτό μας δίνει τον συνδυασμό των γραμμών που ικανοποιούν μια συνθήκη.
Ας δούμε ένα παράδειγμα:
-- QUERY 2: Customers' orders SELECT Customers.CustomerID,CompanyName,City, OrderID,OrderDateFROM CustomersINNER JOIN Orders ON Customers.CustomerID = Orders.CustomerIDORDER BY Customers.CustomerID, OrderDate;GO
Με το Query 2 παίρνουμε τον συνδυασμό πελατών και παραγγελιών. Στο result set εμφανίζεται κάθε πελάτης που έχει κάνει κάποια παραγγελία μαζί με τα επιλεγμένα στοιχεία για την παραγγελία αυτή (δηλαδή το id και η ημερομηνία). Αν κάποιος πελάτης έχει κάνει 4 παραγγελίες ο πελάτης αυτός θα εμφανίζεται σε 4 διαφορετικές γραμμές, καθώς επίσης αν ο πελάτης δεν έχει κάνει καμία παραγγελία ποτέ, δεν θα εμφανιστεί καθόλου. Το result set έχει την παρακάτω μορφή και έχει 830 γραμμές:
OUTER JOIN
Το outer join έχει τρεις μορφές, το left outer join, to right outer join και το full outer join. Με αυτό παίρνουμε τον συνδυασμό των εγγραφών από τους δύο πίνακες για τις οποίες ικανοποιείται η δεδομένη συνθήκη, αλλά και κάποιες ακόμα ανάλογά με την μορφή του outer join που επιλέγουμε. Στην περίπτωση του left outer join παίρνουμε και όσες εγγραφές του αριστερού πίνακα δεν αντιστοιχούνται με βάση την δεδομένη συνθήκη με κάποια εγγραφή του δεξιού πίνακα. Τα πεδία του δεξιού πίνακα που εμφανίζονται στο αποτέλεσμα για τις εγγραφές αυτές θα είναι null. Αντίστοιχα, με το right outer join παίρνουμε όσες εγγραφές ικανοποιούν την συνθήκη και τις εγγραφές που απομένουν από το δεξιό πίνακα. Στο full outer join, στο αποτέλεσμα μας θα προστεθούν όσες εγγραφές δεν έχουν αντιστοιχισθεί τόσο από το δεξί όσο και από τον αριστερό πίνακα.
-- QUERY 3: Customers' orders, including customers without ordersSELECT Customers.CustomerID,CompanyName,City, OrderID,OrderDateFROM CustomersLEFT OUTER JOIN Orders ON Customers.CustomerID = Orders.CustomerIDORDER BY Customers.CustomerID, OrderDate;GO
Στο Query 3 ζητάμε και πάλι τους πελάτες με τις παραγγελίες τους, όπως κάναμε και στο Query 2, μόνο που τώρα χρησιμοποιούμε left outer join αντί για inner join. Έτσι παίρνουμε και τους πελάτες που δεν έχουν κάνει καμία παραγγελία. Το αποτέλεσμα έχει την ίδια μορφή όμως τώρα το πλήθος των γραμμών είναι 803. Για τους 3 πελάτες που δεν έχουν κάνει ποτέ κάποια παραγγελία τα πεδία OrderID και OrderDate είναι NULL όπως φαίνεται παρακάτω:
Σημείωση: Στην T-SQL δεν υπάρχει ξεχωριστή σύνταξη για natural join. Το natural join δύο πινάκων είναι ένα inner join με συνθήκη ισότητας πάνω στις στήλες με το ίδιο όνομα και έτσι αντιστοιχεί σε ακριβώς αυτό.