Μερικές φορές μπορείτε να παραθέσετε τις εγγραφές από έναν πίνακα ή ένα ερώτημα μαζί με αυτές από έναν ή περισσότερους άλλους πίνακες για να δημιουργήσετε ένα σύνολο εγγραφών, μια λίστα με όλες τις εγγραφές από δύο ή περισσότερους πίνακες. Αυτός ο είναι σκοπός των ερωτημάτων συνένωσης στην Access.
Για να κατανοήσετε αποτελεσματικά τα ερωτήματα συνένωσης, θα πρέπει πρώτα να εξοικειωθείτε με τη σχεδίαση βασικών ερωτημάτων επιλογής στην Access. Για περισσότερες πληροφορίες σχετικά με τη σχεδίαση ερωτημάτων επιλογής, ανατρέξτε στο θέμα Δημιουργία απλού ερωτήματος επιλογής.
Μελετήστε ένα παράδειγμα ερωτήματος συνένωσης
Εάν δεν έχετε δημιουργήσει ποτέ στο παρελθόν ένα ερώτημα συνένωσης, μπορεί να είναι χρήσιμο να μελετήσετε πρώτα ένα παράδειγμα στο πρότυπο Northwind της Access. Μπορείτε να αναζητήσετε το δείγμα προτύπου Northwind στη σελίδα εκκίνησης της Access, κάνοντας κλικ στην επιλογή Αρχείο > Δημιουργία ή μπορείτε να πραγματοποιήσετε άμεσα λήψη ενός αντιγράφου από αυτήν τη θέση: Δείγμα προτύπου Northwind.
Μετά το άνοιγμα της βάσης δεδομένων Northwind, από την Access, κλείστε το κουμπί της φόρμας παραθύρου διαλόγου σύνδεσης που εμφανίζεται αρχικά και, στη συνέχεια, αναπτύξτε το παράθυρο περιήγησης. Κάντε κλικ στο επάνω μέρος του παραθύρου περιήγησης και, στη συνέχεια, επιλέξτε Τύπος αντικειμένου για να οργανώσετε όλους τους τύπους αντικειμένων της βάσης δεδομένων σύμφωνα με τον τύπο τους. Στη συνέχεια, αναπτύξτε την ομάδα Ερωτήματα και θα δείτε ένα ερώτημα που ονομάζεται Συναλλαγές προϊόντων.
Η διαφοροποίηση των ερωτημάτων συνένωσης από τα άλλα αντικείμενα του ερωτήματος είναι εύκολη, επειδή φέρουν ένα ειδικό εικονίδιο που μοιάζει με δύο διασυνδεδεμένους κύκλους και αντιπροσωπεύει ένα ενωμένο σύνολο που προκύπτει από δύο σύνολα:
Σε αντίθεση με τα κανονικά ερωτήματα επιλογής και ενέργειας, οι πίνακες δεν σχετίζονται με ένα ερώτημα συνένωσης, γεγονός που σημαίνει ότι η σχεδίαση ερωτημάτων γραφικών της Access δεν μπορεί να χρησιμοποιηθεί για τη δημιουργία ή την επεξεργασία ερωτημάτων συνένωσης. Αυτό θα το αντιμετωπίσετε εάν ανοίξετε ένα ερώτημα συνένωσης από το παράθυρο περιήγησης. Η Access την ανοίγει και εμφανίζει τα αποτελέσματα σε προβολή φύλλου δεδομένων. Κάτω από την εντολή Προβολές στην Κεντρική καρτέλα, θα παρατηρήσετε ότι η Προβολή σχεδίασης δεν είναι διαθέσιμη όταν εργάζεστε με ερωτήματα συνένωσης. Μπορείτε να κάνετε εναλλαγή μεταξύ προβολής φύλλου δεδομένων και προβολής SQL μόνο κατά την εργασία με ερωτήματα συνένωσης.
Για να συνεχίσετε τη μελέτη αυτού του παραδείγματος ερωτήματος συνένωσης, κάντε κλικ στην επιλογή Κεντρική > Προβολές > Προβολή SQL για να δείτε τη σύνταξη SQL που την ορίζει. Σε αυτήν την εικόνα, προσθέσαμε ορισμένα επιπλέον διάστημα στο SQL, ώστε να μπορείτε εύκολα να δείτε τα διάφορα μέρη που αποτελούν το ερώτημα συνένωσης.
Ας μελετήσουμε λεπτομερώς τη σύνταξη SQL αυτού του ερωτήματος συνένωσης από τη βάση δεδομένων Northwind:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Το πρώτο και το τρίτο μέρος αυτής της πρότασης SQL είναι ουσιαστικά δύο ερωτήματα επιλογής. Αυτά τα ερωτήματα ανακτούν δύο διαφορετικά σύνολα εγγραφών. μία από τον πίνακα "Παραγγελίες προϊόντων" και μία από τον πίνακα "Αγορές προϊόντων ".
Το δεύτερο μέρος αυτής της πρότασης SQL είναι η λέξη-κλειδί UNION η οποία υποδεικνύει στην Access ότι αυτό το ερώτημα θα συνδυάσει αυτά τα δύο σύνολα εγγραφών.
Το τελευταίο τμήμα αυτής της πρότασης SQL καθορίζει τη διάταξη των συνδυασμένων εγγραφών με τη χρήση της πρότασης ORDER BY. Σε αυτό το παράδειγμα, η Access θα διατάξει όλες τις εγγραφές με βάση το πεδίο "Ημερομηνία παραγγελίας" σε φθίνουσα σειρά.
Σημείωση: Τα ερωτήματα συνένωσης προορίζονται πάντα μόνο για ανάγνωση στην Access. Δεν μπορείτε να αλλάξετε τις τιμές στην προβολή φύλλου δεδομένων.
Δημιουργήστε ένα ερώτημα συνένωσης με τη δημιουργία και τον συνδυασμό των ερωτημάτων επιλογής
Παρόλο που μπορείτε να δημιουργήσετε ένα ερώτημα συνένωσης γράφοντας απευθείας τη σύνταξη SQL σε προβολή SQL, ίσως σας φανεί πιο εύκολο να το δημιουργήσετε σε τμήματα με τα ερωτήματα επιλογής. Μπορείτε να αντιγράψετε και να επικολλήσετε τα τμήματα του SQL σε ένα συνδυασμένο ερώτημα συνένωσης.
Εάν θέλετε να παραλείψετε την ανάγνωση των βημάτων και εναλλακτικά να παρακολουθήσετε ένα παράδειγμα, ανατρέξτε στην επόμενη ενότητα, Παρακολουθήστε ένα παράδειγμα δημιουργίας ενός ερωτήματος συνένωσης.
-
Στην καρτέλα Δημιουργία, στην ομάδα Ερωτήματα, κάντε κλικ στην επιλογή Σχεδίαση ερωτήματος.
-
Κάντε διπλό κλικ στον πίνακα που περιέχει τα πεδία που θέλετε να συμπεριλάβετε. Ο πίνακας προστίθεται στο παράθυρο σχεδίασης ερωτήματος.
-
Στο παράθυρο σχεδίασης ερωτήματος, κάντε διπλό κλικ σε καθένα από τα πεδία που θέλετε να συμπεριλάβετε. Καθώς επιλέγετε πεδία, βεβαιωθείτε ότι προσθέτετε τον ίδιο αριθμό πεδίων, με την ίδια σειρά, που προσθέτετε στα άλλα ερωτήματα επιλογής. Προσέξτε τους τύπους δεδομένων των πεδίων και βεβαιωθείτε ότι έχουν συμβατούς τύπους δεδομένων με τα πεδία που βρίσκονται στην ίδια θέση στα άλλα ερωτήματα τα οποία συνδυάζετε. Για παράδειγμα, εάν το πρώτο ερώτημα επιλογής έχει πέντε πεδία και το πρώτο από αυτά περιέχει δεδομένα ημερομηνίας/ώρας, πρέπει το καθένα από τα άλλα ερωτήματα επιλογής που συνδυάζετε να έχει και αυτό πέντε πεδία, το πρώτο από τα οποία περιέχει δεδομένα ημερομηνίας/ώρας κ.ο.κ.
-
Προαιρετικά, μπορείτε να προσθέσετε κριτήρια στα πεδία πληκτρολογώντας τις κατάλληλες παραστάσεις στη γραμμή Κριτήρια του πλέγματος πεδίων.
-
Αφού ολοκληρώσετε την προσθήκη πεδίων και τα κριτήρια των πεδίων, θα πρέπει να εκτελέσετε το ερώτημα επιλογής και να ελέγξετε το αποτέλεσμά του. Στην καρτέλα Σχεδίαση, στην ομάδα Αποτελέσματα, κάντε κλικ στην εντολή Εκτέλεση.
-
Αλλάξτε το ερώτημα σε Προβολή σχεδίασης.
-
Αποθηκεύστε το ερώτημα επιλογής και αφήστε το ανοιχτό.
-
Επαναλάβετε αυτή τη διαδικασία για κάθε ερώτημα επιλογής που θέλετε να συνδυάσετε.
Αφού έχετε δημιουργήσει πλέον τα ερωτήματα επιλογής σας, είναι ώρα να τα συνδυάσετε. Σε αυτό το βήμα, μπορείτε να δημιουργήσετε το ερώτημα συνένωσης, αντιγράφοντας και επικολλώντας τις προτάσεις SQL.
-
Στην καρτέλα Δημιουργία, στην ομάδα Ερωτήματα, κάντε κλικ στην επιλογή Σχεδίαση ερωτήματος.
-
Στην καρτέλα Σχεδίαση, στην ομάδα Ερώτημα, κάντε κλικ στη Συνένωση. Η Access αποκρύπτει το παράθυρο σχεδίασης ερωτήματος και εμφανίζει την καρτέλα αντικειμένου "Προβολή SQL". Σε αυτό το σημείο, η καρτέλα Προβολή αντικειμένου του SQL είναι κενή.
-
Κάντε κλικ στην καρτέλα για το πρώτο ερώτημα επιλογής που θέλετε να συνδυάσετε στο ερώτημα συνένωσης.
-
Στην Κεντρική καρτέλα, επιλέξτε Προβολή> Προβολή SQL.
-
Αντιγράψτε την πρόταση SQL για το ερώτημα επιλογής. Κάντε κλικ στην καρτέλα για το ερώτημα συνένωσης που ξεκινήσατε να δημιουργείτε νωρίτερα.
-
Επικολλήστε την πρόταση SQL για το ερώτημα επιλογής στην καρτέλα Προβολής SQL του αντικειμένου του ερωτήματος συνένωσης.
-
Διαγράψτε το ελληνικό ερωτηματικό (;) που βρίσκεται στο τέλος της πρότασης SQL του ερωτήματος επιλογής.
-
Πατήστε το πλήκτρο Enter για να μετακινήσετε τον δρομέα προς τα κάτω κατά μία γραμμή και, στη συνέχεια, πληκτρολογήστε UNION στη νέα γραμμή.
-
Κάντε κλικ στην καρτέλα για το επόμενο ερώτημα επιλογής που θέλετε να συνδυάσετε στο ερώτημα συνένωσης.
-
Επαναλάβετε τα βήματα 5 έως 10 αυτής της διαδικασίας μέχρι να αντιγράψετε και να επικολλήσετε όλες τις προτάσεις SQL για τα ερωτήματα επιλογής στο παράθυρο προβολής SQL του ερωτήματος συνένωσης. Μην διαγράψετε το ελληνικό ερωτηματικό ή μην πληκτρολογήσετε τίποτα μετά την πρόταση SQL για το τελευταίο ερώτημα επιλογής.
-
Στην καρτέλα Σχεδίαση, στην ομάδα Αποτελέσματα, κάντε κλικ στην εντολή Εκτέλεση.
Τα αποτελέσματα του ερωτήματος συνένωσης εμφανίζονται στην προβολή φύλλου δεδομένων.
Παρακολουθήστε ένα παράδειγμα δημιουργίας ενός ερωτήματος συνένωσης
Ακολουθεί ένα παράδειγμα το οποίο μπορείτε να αναδημιουργήσετε στο δείγμα βάσης δεδομένων Northwind. Αυτό το ερώτημα συνένωσης συλλέγει τα ονόματα των ατόμων από τον πίνακα Πελάτες και τα συνδυάζει με τα ονόματα των ατόμων από τον πίνακα Προμηθευτές. Εάν θέλετε να συνεχίσετε, ακολουθήστε αυτά τα βήματα στο δικό σας αντίγραφο του δείγματος βάσης δεδομένων Northwind.
Ακολουθούν τα απαραίτητα βήματα για να δημιουργήσετε αυτό το παράδειγμα:
-
Δημιουργήστε δύο ερωτήματα επιλογής που ονομάζονται Query1 και Query2 με τους πίνακες Πελάτες και Προμηθευτές αντίστοιχα ως προελεύσεις δεδομένων. Χρησιμοποιήστε τα πεδία Όνομα και Επώνυμο ως εμφανιζόμενες τιμές.
-
Δημιουργήστε ένα νέο ερώτημα που ονομάζεται Query3 αρχικά χωρίς προέλευση δεδομένων και, στη συνέχεια, κάντε κλικ στην εντολή Συνένωση στην καρτέλα Σχεδίαση για να μετατρέψετε αυτό το ερώτημα σε ερώτημα συνένωσης.
-
Αντιγράψτε και επικολλήστε τις προτάσεις SQL από το Query1 και το Query2 στο Query3. Θα πρέπει να καταργήσετε το επιπλέον ελληνικό ερωτηματικό και να προσθέσετε τη λέξη-κλειδί UNION. Στη συνέχεια, μπορείτε να δείτε τα αποτελέσματα στην προβολή φύλλου δεδομένων.
-
Προσθέστε έναν όρο ταξινόμησης σε ένα από τα ερωτήματα και, στη συνέχεια, επικολλήσετε την πρόταση ORDER BY στην προβολή SQL ερωτήματος συνένωσης. Λάβετε υπόψη ότι στο Query3, το ερώτημα συνένωσης, όταν πρόκειται να προστεθεί η ταξινόμηση, καταργούνται πρώτα τα ελληνικά ερωτηματικά και, στη συνέχεια, το όνομα του πίνακα από τα ονόματα πεδίων.
-
Το τελικό SQL που συνδυάζει και ταξινομεί τα ονόματα για αυτό το παράδειγμα ερωτήματος συνένωσης είναι το εξής:
SELECT Customers.Company, Customers.[Last Name], Customers.[First Name] FROM Customers UNION SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name] FROM Suppliers ORDER BY [Last Name], [First Name];
Εάν είστε απόλυτα εξοικειωμένοι με τη σύνταξη SQL, μπορείτε φυσικά να δημιουργήσετε τη δική σας πρόταση SQL για το ερώτημα συνένωσης απευθείας σε προβολή SQL. Ωστόσο, ίσως σας φανεί χρήσιμο να παρακολουθήσετε την προσέγγιση της αντιγραφής και της επικόλλησης του SQL από άλλα αντικείμενα του ερωτήματος. Κάθε ερώτημα μπορεί να είναι πολύ πιο περίπλοκο από τα παραδείγματα απλών ερωτημάτων επιλογής που χρησιμοποιούνται εδώ. Μπορεί να είναι προς όφελός σας να δημιουργήσετε και να ελέγξετε κάθε ερώτημα προσεκτικά πριν τα συνδυάσετε στο ερώτημα συνένωσης. Εάν η εκτέλεση του ερωτήματος συνένωσης αποτύχει, μπορείτε να προσαρμόσετε κάθε ερώτημα μεμονωμένα μέχρι να ολοκληρωθεί με επιτυχία και, στη συνέχεια, να δημιουργήσετε ξανά το ερώτημα συνένωσης με τη διορθωμένη σύνταξη.
Ελέγξτε τις υπόλοιπες ενότητες αυτού του άρθρου για να μάθετε περισσότερες συμβουλές και κόλπα για τη χρήση των ερωτημάτων συνένωσης.
Στο παράδειγμα από την προηγούμενη ενότητα που χρησιμοποιεί τη βάση δεδομένων Northwind, συνδυάζονται μόνο τα δεδομένα από δύο πίνακες. Ωστόσο, μπορείτε να συνδυάσετε πολύ εύκολα τρεις ή περισσότερους πίνακες σε ένα ερώτημα συνένωσης. Για παράδειγμα, με βάση το προηγούμενο παράδειγμα, μπορεί να συμπεριλάβετε επίσης τα ονόματα των υπαλλήλων στο αποτέλεσμα του ερωτήματος. Μπορείτε να πραγματοποιήσετε αυτή την εργασία με την προσθήκη ενός τρίτου ερωτήματος και συνδυάζοντάς το με την προηγούμενη πρόταση SQL, με μια επιπλέον λέξη-κλειδί UNION ως εξής:
SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Όταν προβάλετε τα αποτελέσματα στην προβολή φύλλου δεδομένων, όλοι οι υπάλληλοι θα εμφανίζονται με το δείγμα του ονόματος της εταιρείας, το οποίο ίσως και να μην είναι πολύ χρήσιμο. Εάν θέλετε αυτό το πεδίο να υποδεικνύει εάν ένα άτομο αποτελεί εσωτερικό υπάλληλο, προμηθευτή ή πελάτη, μπορείτε να συμπεριλάβετε μια σταθερή τιμή αντί για το όνομα της εταιρείας. Το SQL θα εμφανίζεται ως εξής:
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Το αποτέλεσμα θα εμφανίζεται ως εξής στην προβολή φύλλου δεδομένων. Η Access εμφανίζει αυτά τα πέντε παράδειγμα εγγραφών:
Απασχόληση |
Επώνυμο |
Όνομα |
Εσωτερικά |
Δράκου |
Ανδριάνα |
Εσωτερικά |
Γιώργη |
Αντιγόνη |
Προμηθευτής |
Παπαδόπουλος |
Νικήτας |
Πελάτης |
Γιακουμάκης |
Χρήστος |
Πελάτης |
Βασίλης Παπαδήμου |
Βασίλης |
Το παραπάνω ερώτημα μπορεί να περιοριστεί ακόμη περισσότερο, επειδή η Access διαβάζει μόνο τα ονόματα των πεδίων εξόδου από το πρώτο ερώτημα σε ένα ερώτημα συνένωσης. Εδώ μπορείτε να δείτε ότι καταργήσαμε την έξοδο από τη δεύτερη και τρίτη ενότητα ερωτήματος:
SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
UNION
SELECT "In-house", [Last Name], [First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Σε ένα ερώτημα συνένωσης της Access, η ταξινόμηση επιτρέπεται μόνο μία φορά, αλλά κάθε ερώτημα μπορεί να φιλτραριστεί μεμονωμένα. Με βάση το ερώτημα συνένωσης της προηγούμενης ενότητας, ακολουθεί ένα παράδειγμα όπου έχουμε φιλτράρει κάθε ερώτημα, προσθέτοντας έναν όρο WHERE.
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"
UNION
SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"
ORDER BY [Last Name], [First Name];
Κάντε εναλλαγή στην προβολή φύλλου δεδομένων και θα δείτε τα εξής αποτελέσματα:
Απασχόληση |
Επώνυμο |
Όνομα |
Προμηθευτής |
Ηλιοπούλου |
Ελένη Κ. |
Εσωτερικά |
Δράκου |
Ανδριάνα |
Πελάτης |
Ντούντης |
Πέτρος |
Εσωτερικά |
Χρήστου |
Ελένη |
Προμηθευτής |
Ανδρεάδη |
Ντέλια |
Πελάτης |
Τζεβελέκος |
Σταύρος |
Προμηθευτής |
Παπαδήμου |
Ίκαρος |
Προμηθευτής |
Βασιλείου |
Άννα |
Εσωτερικά |
Γεωργίου |
Νίκος |
Προμηθευτής |
Αντωνοπούλου |
Αλεξία |
Εσωτερικά |
Φλωράς |
Ορέστης |
Εάν τα ερωτήματα συνένωσης διαφέρουν πολύ, μπορεί να αντιμετωπίσετε μια κατάσταση όπου το πεδίο εξόδου θα πρέπει να συνδυάσει δεδομένα από διαφορετικούς τύπους δεδομένων. Σε αυτήν την περίπτωση, το ερώτημα συνένωσης θα επιστρέφει συχνά τα αποτελέσματα ως τύπο δεδομένων κειμένου, δεδομένου ότι αυτός ο τύπος δεδομένων μπορεί να περιέχει κείμενο και αριθμούς.
Για να κατανοήσετε πώς λειτουργεί αυτό, θα χρησιμοποιήσουμε το ερώτημα συνένωσης Συναλλαγές προϊόντων στο δείγμα βάσης δεδομένων Northwind. Ανοίξτε αυτό το δείγμα βάσης δεδομένων και, στη συνέχεια, ανοίξτε το ερώτημα "Συναλλαγές προϊόντων" σε προβολή φύλλου δεδομένων. Οι τελευταίες 10 εγγραφές θα πρέπει να μοιάζουν με αυτό το αποτέλεσμα:
Αναγνωριστικό προϊόντος |
Ημερομηνία παραγγελίας |
Επωνυμία εταιρείας |
Συναλλαγή |
Ποσότητα |
77 |
22/1/2006 |
Προμηθευτής Β |
Αγορά |
60 |
80 |
22/1/2006 |
Προμηθευτής Δ |
Αγορά |
75 |
81 |
22/1/2006 |
Προμηθευτής Α |
Αγορά |
125 |
81 |
22/1/2006 |
Προμηθευτής Α |
Αγορά |
200 |
7 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
10 |
51 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
10 |
80 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
10 |
34 |
15/1/2006 |
Εταιρεία AA |
Τιμή |
100 |
80 |
15/1/2006 |
Εταιρεία AA |
Τιμή |
30 |
Ας υποθέσουμε ότι θέλετε το πεδίο Ποσότητα να διαιρεθεί σε δύο - Αγορά και Πώληση. Ας υποθέσουμε επίσης ότι θέλετε να έχετε μια σταθερή τιμή "μηδέν" για το πεδίο με χωρίς τιμή. Το SQL θα εμφανίζεται ως εξής για αυτό το ερώτημα συνένωσης:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Εάν κάνετε εναλλαγή σε προβολή φύλλου δεδομένων, θα δείτε ότι οι τελευταίες δέκα εγγραφές εμφανίζεται πλέον ως εξής:
Αναγνωριστικό προϊόντος |
Ημερομηνία παραγγελίας |
Επωνυμία εταιρείας |
Συναλλαγή |
Αγορά |
Πώληση |
74 |
22/1/2006 |
Προμηθευτής Β |
Αγορά |
20 |
0 |
77 |
22/1/2006 |
Προμηθευτής Β |
Αγορά |
60 |
0 |
80 |
22/1/2006 |
Προμηθευτής Δ |
Αγορά |
75 |
0 |
81 |
22/1/2006 |
Προμηθευτής Α |
Αγορά |
125 |
0 |
81 |
22/1/2006 |
Προμηθευτής Α |
Αγορά |
200 |
0 |
7 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
0 |
10 |
51 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
0 |
10 |
80 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
0 |
10 |
34 |
15/1/2006 |
Εταιρεία AA |
Τιμή |
0 |
100 |
80 |
15/1/2006 |
Εταιρεία AA |
Τιμή |
0 |
30 |
Συνεχίζοντας αυτό το παράδειγμα, τι γίνεται εάν θέλετε τα πεδία με το μηδέν να είναι κενά; Μπορείτε να τροποποιήσετε την SQL ώστε να μην εμφανίζεται τίποτα αντί για το μηδέν, προσθέτοντας τη λέξη-κλειδί Null ως εξής:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Ωστόσο, όπως μπορεί να έχετε παρατηρήσει με την εναλλαγή στην προβολή φύλλου δεδομένων, έχετε πλέον ένα μη αναμενόμενο αποτέλεσμα. Στη στήλη "Αγορά", καταργείται κάθε πεδίο:
Αναγνωριστικό προϊόντος |
Ημερομηνία παραγγελίας |
Επωνυμία εταιρείας |
Συναλλαγή |
Αγορά |
Πώληση |
74 |
22/1/2006 |
Προμηθευτής Β |
Αγορά |
||
77 |
22/1/2006 |
Προμηθευτής Β |
Αγορά |
||
80 |
22/1/2006 |
Προμηθευτής Δ |
Αγορά |
||
81 |
22/1/2006 |
Προμηθευτής Α |
Αγορά |
||
81 |
22/1/2006 |
Προμηθευτής Α |
Αγορά |
||
7 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
10 |
|
51 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
10 |
|
80 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
10 |
|
34 |
15/1/2006 |
Εταιρεία AA |
Τιμή |
100 |
|
80 |
15/1/2006 |
Εταιρεία AA |
Τιμή |
30 |
Αυτό το πρόβλημα παρουσιάζεται επειδή η Access προσδιορίζει τους τύπους δεδομένων των πεδίων από το πρώτο ερώτημα. Σε αυτό το παράδειγμα, η τιμή Null δεν αποτελεί αριθμό.
Τι γίνεται λοιπόν εάν προσπαθήσετε να εισαγάγετε μια κενή συμβολοσειρά για την κενή τιμή των πεδίων; Το SQL για αυτή την προσπάθεια μπορεί να μοιάζει με το εξής:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Κατά την εναλλαγή σε προβολή φύλλου δεδομένων, θα δείτε ότι η Access ανακτά τις τιμές στη στήλη "Αγορά", αλλά μετατρέπει τις τιμές σε κείμενο. Μπορείτε να διαπιστώσετε ότι πρόκειται για τιμές κειμένου, εφόσον είναι στοιχισμένες αριστερά στην προβολή φύλλου δεδομένων. Η πρώτη κενή συμβολοσειρά στο πρώτο ερώτημα δεν αποτελεί αριθμό, για τον λόγο αυτό, μπορεί να εμφανίζονται αυτά τα αποτελέσματα. Επίσης, θα διαπιστώσετε ότι οι τιμές στη στήλη "Πώληση" μετατρέπονται επίσης σε κείμενο επειδή οι εγγραφές αγοράς περιέχουν μια κενή συμβολοσειρά.
Αναγνωριστικό προϊόντος |
Ημερομηνία παραγγελίας |
Επωνυμία εταιρείας |
Συναλλαγή |
Αγορά |
Πώληση |
74 |
22/1/2006 |
Προμηθευτής Β |
Αγορά |
20 |
|
77 |
22/1/2006 |
Προμηθευτής Β |
Αγορά |
60 |
|
80 |
22/1/2006 |
Προμηθευτής Δ |
Αγορά |
75 |
|
81 |
22/1/2006 |
Προμηθευτής Α |
Αγορά |
125 |
|
81 |
22/1/2006 |
Προμηθευτής Α |
Αγορά |
200 |
|
7 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
10 |
|
51 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
10 |
|
80 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
10 |
|
34 |
15/1/2006 |
Εταιρεία AA |
Τιμή |
100 |
|
80 |
15/1/2006 |
Εταιρεία AA |
Τιμή |
30 |
Πώς μπορείτε να λύσετε αυτόν τον γρίφο;
Μια λύση είναι να επιβάλετε στο ερώτημα να αναμένει αριθμητική τιμή για το πεδίο. Αυτό μπορεί να γίνει με την παράσταση:
IIf(False, 0, Null)
Η συνθήκη για έλεγχο, False, δεν θα είναι ποτέ True, επομένως η παράσταση θα επιστρέφει πάντα την τιμή Null, αλλά η Access εξακολουθεί να αξιολογεί και τις δύο επιλογές εξόδου και να καθορίζει εάν το αποτέλεσμα θα είναι αριθμητικά ή Null.
Μπορούμε να χρησιμοποιήσουμε αυτήν την παράσταση στο παράδειγμά μας ως εξής:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Λάβετε υπόψη ότι δεν χρειάζεται να τροποποιήσετε το δεύτερο ερώτημα.
Εάν κάνετε εναλλαγή σε προβολή φύλλου δεδομένων, θα δείτε τώρα το επιθυμητό αποτέλεσμα:
Αναγνωριστικό προϊόντος |
Ημερομηνία παραγγελίας |
Επωνυμία εταιρείας |
Συναλλαγή |
Αγορά |
Πώληση |
74 |
22/1/2006 |
Προμηθευτής Β |
Αγορά |
20 |
|
77 |
22/1/2006 |
Προμηθευτής Β |
Αγορά |
60 |
|
80 |
22/1/2006 |
Προμηθευτής Δ |
Αγορά |
75 |
|
81 |
22/1/2006 |
Προμηθευτής Α |
Αγορά |
125 |
|
81 |
22/1/2006 |
Προμηθευτής Α |
Αγορά |
200 |
|
7 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
10 |
|
51 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
10 |
|
80 |
20/1/2006 |
Εταιρεία Δ |
Τιμή |
10 |
|
34 |
15/1/2006 |
Εταιρεία AA |
Τιμή |
100 |
|
80 |
15/1/2006 |
Εταιρεία AA |
Τιμή |
30 |
Μια εναλλακτική μέθοδος για να επιτύχετε το ίδιο αποτέλεσμα είναι να προσθέσετε πριν από τα ερωτήματα στο ερώτημα συνένωσης κάποιο άλλο ερώτημα:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
Για κάθε πεδίο, η Access επιστρέφει σταθερές τιμές από τον τύπο δεδομένων που έχετε ορίσει. Φυσικά, δεν θέλετε το αποτέλεσμα αυτού του ερωτήματος να παρεμβάλλεται στα αποτελέσματα, επομένως ο τρόπος για να αποφύγετε κάτι τέτοιο είναι να συμπεριλάβετε τον όρο WHERE στην επιλογή False:
WHERE False
Αυτό είναι ένα μικρό κόλπο, εφόσον αυτό είναι πάντα false και έτσι, το ερώτημα δεν επιστρέφει τίποτε. Συνδυάζοντας αυτήν την πρόταση με το υπάρχον SQL καταλήγουμε σε μια ολοκληρωμένη πρόταση ως εξής:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
UNION
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Σημείωση: Εδώ το συνδυασμένο ερώτημα σε αυτό το παράδειγμα που χρησιμοποιεί τη βάση δεδομένων Northwind επιστρέφει 100 εγγραφές, ενώ τα δύο μεμονωμένα ερωτήματα επιστρέφουν 58 και 43 εγγραφές για ένα σύνολο 101 εγγραφών. Η αιτία αυτής της απόκλισης είναι ότι οι δύο εγγραφές δεν είναι μοναδικές. Ανατρέξτε στην ενότητα Εργασία με διαφορετικές εγγραφές σε ερωτήματα συνένωσης χρησιμοποιώντας την επιλογή UNION ALL, για να μάθετε πώς μπορείτε να επιλύσετε αυτό το σενάριο χρησιμοποιώντας την επιλογή UNION ALL.
Μια ειδική περίπτωση για ένα ερώτημα συνένωσης είναι ο συνδυασμός ενός συνόλου εγγραφών με μία εγγραφή που περιέχει το άθροισμα ενός ή περισσότερων πεδίων.
Ακολουθεί ένα άλλο παράδειγμα που μπορείτε να δημιουργήσετε στο δείγμα της βάσης δεδομένων Northwind που δείχνει πώς μπορείτε να λάβετε ένα σύνολο σε ένα ερώτημα συνένωσης.
-
Δημιουργήστε ένα νέο απλό ερώτημα για να προβάλετε την αγορά για τις μπίρες (αναγνωριστικό προϊόντος = 34 στη βάση δεδομένων Northwind) χρησιμοποιώντας την ακόλουθη σύνταξη SQL:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];
-
Κάντε εναλλαγή στην προβολή φύλλου δεδομένων και θα δείτε τέσσερις αγορές:
Ημερομηνία λήψης
Ποσότητα
22/1/2006
100
22/1/2006
60
4/4/2006
50
5/4/2006
300
-
Για να λάβετε το σύνολο, δημιουργήστε ένα απλό ερώτημα συγκέντρωσης χρησιμοποιώντας το εξής SQL:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))
-
Κάντε εναλλαγή στην προβολή φύλλου δεδομένων και θα δείτε μόνο μία εγγραφή:
MaxOfDate Received
SumOfQuantity
5/4/2006
510
-
Συνδυάστε αυτά τα δύο ερωτήματα σε ένα ερώτημα συνένωσης για να προσαρτήσετε την εγγραφή με τη συνολική ποσότητα στις εγγραφές αγοράς:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) UNION SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];
-
Κάντε εναλλαγή στην προβολή φύλλου δεδομένων και θα πρέπει να δείτε τις τέσσερις αγορές με το άθροισμα της καθεμίας, ακολουθούμενο από μια εγγραφή με το άθροισμα της ποσότητας:
Ημερομηνία λήψης
Ποσότητα
22/1/2006
60
22/1/2006
100
4/4/2006
50
5/4/2006
300
5/4/2006
510
Αυτό καλύπτει τα βασικά στοιχεία για την προσθήκη συνόλων σε ένα ερώτημα συνένωσης. Μπορείτε επίσης να συμπεριλάβετε σταθερές τιμές και στα δύο ερωτήματα, όπως "Λεπτομέρειες" και "Σύνολο" για να διαχωρίσετε οπτικά το σύνολο εγγραφών από τις άλλες εγγραφές. Μπορείτε να μάθετε σχετικά με τη χρήση σταθερών τιμών στην ενότητα Συνδυασμός τριών ή περισσότερων πινάκων ή ερωτημάτων σε ένα ερώτημα συνένωσης.
Τα ερωτήματα συνένωσης στην Access περιλαμβάνουν από προεπιλογή μόνο διακριτές εγγραφές. Τι γίνεται όμως εάν θέλετε να συμπεριλάβετε όλες τις εγγραφές; Ένα άλλο παράδειγμα μπορεί να είναι χρήσιμο εδώ.
Στην προηγούμενη ενότητα, σας δείξαμε πώς μπορείτε να δημιουργήσετε ένα σύνολο σε ένα ερώτημα συνένωσης. Τροποποιήστε αυτό το ερώτημα συνένωσης SQL ώστε να συμπεριλάβετε το αναγνωριστικό προϊόντος = 48:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Purchase Order Details].[Date Received];
Κάντε εναλλαγή στην προβολή φύλλου δεδομένων και θα πρέπει να δείτε ένα κάπως παραπλανητικό αποτέλεσμα:
Ημερομηνία λήψης |
Ποσότητα |
22/1/2006 |
100 |
22/1/2006 |
200 |
Μία εγγραφή φυσικά δεν επιστρέφει δύο φορές την ποσότητα συνολικά.
Ο λόγος για τον οποίο βλέπετε αυτό το αποτέλεσμα είναι επειδή μία ημέρα, η ίδια ποσότητα σοκολάτας πωλήθηκε δύο φορές, όπως αναφέρεται στον πίνακα "Λεπτομέρειες παραγγελίας αγοράς". Ακολουθεί ένα αποτέλεσμα απλού ερωτήματος επιλογής που εμφανίζει δύο εγγραφές στο δείγμα βάσης δεδομένων Northwind:
Αναγνωριστικό παραγγελίας αγοράς |
Προϊόν |
Ποσότητα |
100 |
Northwind Traders Chocolate |
100 |
92 |
Northwind Traders Chocolate |
100 |
Στο ερώτημα συνένωσης που αναφέρθηκε προηγουμένως, μπορείτε να δείτε ότι το πεδίο "Αναγνωριστικού παραγγελίας αγοράς" δεν περιλαμβάνεται και ότι τα δύο πεδία δεν αποτελούν δύο διαφορετικές εγγραφές.
Εάν θέλετε να συμπεριλάβετε όλες τις εγγραφές, χρησιμοποιήστε την επιλογή UNION ALL αντί για την επιλογή UNION στο SQL. Αυτό συνήθως είναι πιθανό να έχει επιπτώσεις στην ταξινόμηση των αποτελεσμάτων, επομένως μπορείτε να συμπεριλάβετε επίσης τον όρο ORDER BY για να καθορίσετε μια σειρά ταξινόμησης. Αυτό είναι το τροποποιημένο SQL με βάση το προηγούμενο παράδειγμα:
SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION ALL
SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Total];
Κάντε εναλλαγή στην προβολή φύλλου δεδομένων και θα πρέπει να δείτε όλες τις λεπτομέρειες εκτός από το σύνολο ως τελευταία εγγραφή:
Ημερομηνία λήψης |
Σύνολο |
Ποσότητα |
22/1/2006 |
100 |
|
22/1/2006 |
100 |
|
22/1/2006 |
Σύνολο |
200 |
Μια συνηθισμένη χρήση ενός ερωτήματος συνένωσης είναι η χρήση ως προέλευση εγγραφών για ένα στοιχείο ελέγχου σύνθετου πλαισίου σε μια φόρμα. Μπορείτε να χρησιμοποιήσετε αυτό το σύνθετο πλαίσιο για να επιλέξετε μια τιμή για να φιλτράρετε τις εγγραφές της φόρμας. Για παράδειγμα, φιλτράρισμα των εγγραφών υπαλλήλων με βάση την πόλη τους.
Για να δείτε πώς μπορεί να λειτουργεί αυτό, ακολουθεί ένα άλλο παράδειγμα που μπορείτε να δημιουργήσετε στο δείγμα της βάσης δεδομένων Northwind που περιγράφει αυτό το σενάριο.
-
Δημιουργήστε ένα απλό ερώτημα επιλογής χρησιμοποιώντας αυτή τη σύνταξη SQL:
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
Κάντε εναλλαγή στην προβολή φύλλου δεδομένων και θα πρέπει να δείτε τα εξής αποτελέσματα:
Πόλη
Φίλτρο
Πειραιάς
Πειραιάς
Καλαμάτα
Καλαμάτα
Βόλος
Βόλος
Ηράκλειο
Ηράκλειο
Πειραιάς
Πειραιάς
Βόλος
Βόλος
Πειραιάς
Πειραιάς
Βόλος
Βόλος
Πειραιάς
Πειραιάς
-
Εξετάζοντας αυτά τα αποτελέσματα μπορεί να μην εμφανίζονται πολλές τιμές. Αναπτύξτε το ερώτημα και μετατρέψτε το σε ερώτημα συνένωσης, χρησιμοποιώντας το παρακάτω SQL:
SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;
-
Κάντε εναλλαγή στην προβολή φύλλου δεδομένων και θα πρέπει να δείτε τα εξής αποτελέσματα:
Πόλη
Φίλτρο
<All>
*
Καλαμάτα
Καλαμάτα
Ηράκλειο
Ηράκλειο
Βόλος
Βόλος
Πειραιάς
Πειραιάς
Η Access εκτελεί συνένωση από τις εννέα εγγραφές, που εμφανιζόταν προηγουμένως, με σταθερές τιμές πεδίων <All> και "*".
Καθώς αυτός ο όρος συνένωσης δεν περιέχει την επιλογή UNION ALL, η Access επιστρέφει μόνο τις διαφορετικές εγγραφές, κάτι που σημαίνει ότι κάθε πόλη επιστρέφεται μόνο μία φορά με σταθερές πανομοιότυπες τιμές.
-
Τώρα που έχετε ένα ολοκληρωμένο ερώτημα συνένωσης που εμφανίζει το όνομα της κάθε πόλης μόνο μία φορά, μαζί με την επιλογή που επιλέγει όλες τις πόλεις, μπορείτε να χρησιμοποιήσετε αυτό το ερώτημα ως προέλευση εγγραφών για ένα σύνθετο πλαίσιο σε μια φόρμα. Χρησιμοποιώντας αυτό το συγκεκριμένο παράδειγμα ως μοντέλο, μπορείτε να δημιουργήσετε ένα στοιχείο ελέγχου σύνθετου πλαισίου σε μια φόρμα, να ορίσετε αυτό το ερώτημα ως προέλευση εγγραφών, να ορίσετε την ιδιότητα "Πλάτος στήλης" της στήλης "Φίλτρο" σε 0 (μηδέν) για να την αποκρύψετε οπτικά και, στη συνέχεια, να ορίσετε τη στήλη "Δεσμευμένη στήλη" σε 1, για να υποδείξετε το ευρετήριο από τη δεύτερη στήλη. Στην ιδιότητα "Φίλτρο" από την ίδια τη φόρμα, μπορείτε να προσθέσετε, στη συνέχεια, κώδικα, όπως ο ακόλουθος, για να ενεργοποιήσετε ένα φίλτρο της φόρμας χρησιμοποιώντας την τιμή που είχε επιλεγεί στο στοιχείο ελέγχου του σύνθετου πλαισίου:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
Ο χρήστης της φόρμας μπορεί, στη συνέχεια, να φιλτράρει τις εγγραφές της φόρμας σε ένα συγκεκριμένο όνομα πόλης ή να επιλέξει <All> για να εμφανίσει όλες τις εγγραφές για όλες τις πόλεις.