Χρήση ερωτήματος συνένωσης για τον συνδυασμό πολλών ερωτημάτων σε ένα αποτέλεσμα

Ισχύει για
Access για Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

Μερικές φορές μπορεί να θέλετε να συνδυάσετε εγγραφές από έναν πίνακα ή ένα ερώτημα με εγγραφές από έναν ή περισσότερους άλλους πίνακες σε ένα ενιαίο αποτέλεσμα. Αυτό ακριβώς κάνει ένα ερώτημα συνένωσης στην Access.

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

Μελετήστε ένα παράδειγμα ερωτήματος συνένωσης

Εάν δεν έχετε δημιουργήσει ποτέ στο παρελθόν ένα ερώτημα συνένωσης, θα ήταν χρήσιμο να μελετήσετε πρώτα ένα παράδειγμα στο πρότυπο Northwind της Access. Μπορείτε να αναζητήσετε το δείγμα προτύπου Northwind στη σελίδα εκκίνησης της Access, επιλέγοντας " Αρχείο>δημιουργίας". Μπορείτε επίσης να κάνετε λήψη ενός αντιγράφου απευθείας από το δείγμα προτύπου Northwind.

Μετά το άνοιγμα της βάσης δεδομένων Northwind, από την Access, κλείστε το παράθυρο διαλόγου σύνδεσης που εμφανίζεται αρχικά και, στη συνέχεια, αναπτύξτε το παράθυρο περιήγησης. Επιλέξτε το επάνω μέρος του παραθύρου περιήγησης και, στη συνέχεια, επιλέξτε " Τύπος αντικειμένου " για να οργανώσετε όλα τα αντικείμενα της βάσης δεδομένων κατά τύπο. Στη συνέχεια, αναπτύξτε την ομάδα "Ερωτήματα " και θα δείτε ένα ερώτημα που ονομάζεται Συναλλαγές προϊόντων.

Η διαφοροποίηση των ερωτημάτων συνένωσης από τα άλλα αντικείμενα του ερωτήματος είναι εύκολη, επειδή φέρουν ένα ειδικό εικονίδιο που μοιάζει με δύο διασυνδεδεμένους κύκλους και αντιπροσωπεύει ένα ενωμένο σύνολο που προκύπτει από δύο σύνολα:

Στιγμιότυπο οθόνης με ένα εικονίδιο ερωτήματος συνένωσης στην 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 σε ένα συνδυασμένο ερώτημα συνένωσης.

Εάν θέλετε να παραλείψετε την ανάγνωση των βημάτων και εναλλακτικά να παρακολουθήσετε ένα παράδειγμα, ανατρέξτε στην επόμενη ενότητα, Παρακολουθήστε ένα παράδειγμα δημιουργίας ενός ερωτήματος συνένωσης.

  1. Στην καρτέλα Δημιουργία, στην ομάδα Ερωτήματα, κάντε κλικ στην επιλογή Σχεδίαση ερωτήματος.
  2. Κάντε διπλό κλικ στον πίνακα που περιέχει τα πεδία τα οποία θέλετε να συμπεριλάβετε. Ο πίνακας προστίθεται στο παράθυρο σχεδίασης ερωτήματος.
  3. Στο παράθυρο σχεδίασης ερωτήματος, κάντε διπλό κλικ σε καθένα από τα πεδία που θέλετε να συμπεριλάβετε. Καθώς επιλέγετε πεδία, βεβαιωθείτε ότι προσθέτετε τον ίδιο αριθμό πεδίων, με την ίδια σειρά, που προσθέτετε στα άλλα ερωτήματα επιλογής. Προσέξτε τους τύπους δεδομένων των πεδίων και βεβαιωθείτε ότι έχουν συμβατούς τύπους δεδομένων με τα πεδία που βρίσκονται στην ίδια θέση στα άλλα ερωτήματα τα οποία συνδυάζετε. Για παράδειγμα, εάν το πρώτο ερώτημα επιλογής έχει πέντε πεδία και το πρώτο από αυτά περιέχει δεδομένα ημερομηνίας/ώρας, πρέπει το καθένα από τα άλλα ερωτήματα επιλογής που συνδυάζετε να έχει και αυτό πέντε πεδία, το πρώτο από τα οποία περιέχει δεδομένα ημερομηνίας/ώρας κ.ο.κ.
  4. Προαιρετικά, μπορείτε να προσθέσετε κριτήρια στα πεδία πληκτρολογώντας τις κατάλληλες παραστάσεις στη γραμμή Κριτήρια του πλέγματος πεδίων.
  5. Αφού ολοκληρώσετε την προσθήκη πεδίων και τα κριτήρια των πεδίων, θα πρέπει να εκτελέσετε το ερώτημα επιλογής και να ελέγξετε το αποτέλεσμά του. Στην καρτέλα Σχεδίαση, στην ομάδα Αποτελέσματα, κάντε κλικ στην εντολή Εκτέλεση.
  6. Αλλάξτε το ερώτημα σε Προβολή σχεδίασης.
  7. Αποθηκεύστε το ερώτημα επιλογής και αφήστε το ανοιχτό.
  8. Επαναλάβετε αυτή τη διαδικασία για κάθε ερώτημα επιλογής που θέλετε να συνδυάσετε.

Τώρα που έχετε δημιουργήσει τα ερωτήματα επιλογής σας, είναι ώρα να τα συνδυάσετε. Σε αυτό το βήμα, μπορείτε να δημιουργήσετε το ερώτημα συνένωσης, αντιγράφοντας και επικολλώντας τις SQL προτάσεις.

  1. Στην καρτέλα Δημιουργία, στην ομάδα Ερωτήματα, κάντε κλικ στην επιλογή Σχεδίαση ερωτήματος.
  2. Στην καρτέλα Σχεδίαση, στην ομάδα Ερώτημα, κάντε κλικ στη Συνένωση. Η Access αποκρύπτει το παράθυρο σχεδίασης ερωτήματος και εμφανίζει την καρτέλα αντικειμένου "Προβολή SQL ". Σε αυτό το σημείο, η καρτέλα είναι κενή.
  3. Κάντε κλικ στην καρτέλα για το πρώτο ερώτημα επιλογής που θέλετε να συνδυάσετε στο ερώτημα συνένωσης.
  4. Στην "Κεντρική " καρτέλα, κάντε κλικ στην επιλογή "Προβολή>SQL".
  5. Αντιγράψτε την πρόταση για το SQL ερώτημα επιλογής. Κάντε κλικ στην καρτέλα για το ερώτημα συνένωσης που ξεκινήσατε να δημιουργείτε νωρίτερα.
  6. Επικολλήστε την SQL πρόταση για το ερώτημα επιλογής στην καρτέλα Προβολή SQL του αντικειμένου του ερωτήματος συνένωσης.
  7. Διαγράψτε το ελληνικό ερωτηματικό (;) που βρίσκεται στο τέλος της πρότασης ερωτήματος SQL επιλογής.
  8. Πατήστε το πλήκτρο Enter για να μετακινήσετε το δρομέα προς τα κάτω κατά μία γραμμή και, στη συνέχεια, πληκτρολογήστε UNION στη νέα γραμμή.
  9. Κάντε κλικ στην καρτέλα για το επόμενο ερώτημα επιλογής που θέλετε να συνδυάσετε στο ερώτημα συνένωσης.
  10. Επαναλάβετε τα βήματα 5 έως 10 αυτής της διαδικασίας μέχρι να αντιγράψετε και να επικολλήσετε όλες τις SQL προτάσεις για τα ερωτήματα επιλογής στο παράθυρο Προβολή SQL του ερωτήματος συνένωσης. Μην διαγράψετε το ελληνικό ερωτηματικό ή μην πληκτρολογήσετε τίποτα μετά την SQL πρόταση για το τελευταίο ερώτημα επιλογής.
  11. Στην καρτέλα Σχεδίαση, στην ομάδα Αποτελέσματα, κάντε κλικ στην εντολή Εκτέλεση.

Τα αποτελέσματα του ερωτήματος συνένωσης εμφανίζονται στην προβολή φύλλου δεδομένων.

Παρακολουθήστε ένα παράδειγμα δημιουργίας ενός ερωτήματος συνένωσης

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

Ακολουθούν τα απαραίτητα βήματα για να δημιουργήσετε αυτό το παράδειγμα:

  1. Δημιουργήστε δύο ερωτήματα επιλογής που ονομάζονται Query1 και Query2 με τους πίνακες Πελάτες και Προμηθευτές αντίστοιχα ως προελεύσεις δεδομένων. Χρησιμοποιήστε τα πεδία Όνομα και Επώνυμο ως εμφανιζόμενες τιμές.

  2. Δημιουργήστε ένα νέο ερώτημα που ονομάζεται Query3 αρχικά χωρίς προέλευση δεδομένων και, στη συνέχεια, κάντε κλικ στην εντολή Συνένωση στην καρτέλα Σχεδίαση για να μετατρέψετε αυτό το ερώτημα σε ερώτημα συνένωσης.

  3. Αντιγράψτε και επικολλήστε τις προτάσεις SQL από το Query1 και το Query2 στο Query3. Φροντίστε να καταργήσετε το επιπλέον ελληνικό ερωτηματικό και να προσθέσετε τη UNION λέξη-κλειδί. Στη συνέχεια, μπορείτε να δείτε τα αποτελέσματα στην προβολή φύλλου δεδομένων.

  4. Προσθέστε έναν όρο ταξινόμησης σε ένα από τα ερωτήματα και, στη συνέχεια, επικολλήστε την ORDER BY πρόταση στο ερώτημα συνένωσης σε προβολή SQL. Λάβετε υπόψη ότι στο Query3, το ερώτημα συνένωσης, όταν πρόκειται να προστεθεί η ταξινόμηση, καταργούνται πρώτα τα ελληνικά ερωτηματικά και, στη συνέχεια, το όνομα του πίνακα από τα ονόματα πεδίων.

  5. Το τελικό 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 που δείχνει πώς μπορείτε να λάβετε ένα σύνολο σε ένα ερώτημα συνένωσης.

  1. Δημιουργήστε ένα νέο απλό ερώτημα για να προβάλετε την αγορά για τις μπίρες (αναγνωριστικό προϊόντος = 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];
    
  2. Κάντε εναλλαγή στην προβολή φύλλου δεδομένων και θα δείτε τέσσερις αγορές:

    Ημερομηνία λήψης Ποσότητα
    22/1/2006 100
    22/1/2006 60
    4/4/2006 50
    5/4/2006 300
  3. Για να λάβετε το σύνολο, δημιουργήστε ένα απλό ερώτημα συγκέντρωσης χρησιμοποιώντας το εξής SQL:

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
  4. Κάντε εναλλαγή στην προβολή φύλλου δεδομένων και θα δείτε μόνο μία εγγραφή:

    MaxOfDate Received SumOfQuantity
    5/4/2006 510
  5. Συνδυάστε αυτά τα δύο ερωτήματα σε ένα ερώτημα συνένωσης για να προσαρτήσετε την εγγραφή με τη συνολική ποσότητα στις εγγραφές αγοράς:

    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];
    
  6. Κάντε εναλλαγή στην προβολή φύλλου δεδομένων και θα πρέπει να δείτε τις τέσσερις αγορές με το άθροισμα της καθεμίας, ακολουθούμενο από μια εγγραφή με το άθροισμα της ποσότητας:

    Ημερομηνία λήψης Ποσότητα
    22/1/2006 60
    22/1/2006 100
    4/4/2006 50
    5/4/2006 300
    5/4/2006 510

Αυτό καλύπτει τα βασικά στοιχεία για την προσθήκη συνόλων σε ένα ερώτημα συνένωσης. Μπορείτε επίσης να συμπεριλάβετε σταθερές τιμές και στα δύο ερωτήματα, όπως "Λεπτομέρειες" και "Σύνολο" για να διαχωρίσετε οπτικά το σύνολο εγγραφών από τις άλλες εγγραφές. Μπορείτε να μάθετε σχετικά με τη χρήση σταθερών τιμών στην ενότητα Συνδυασμός τριών ή περισσότερων πινάκων ή ερωτημάτων σε ένα ερώτημα συνένωσης.

Εργασία με διαφορετικές εγγραφές σε ερωτήματα συνένωσης χρησιμοποιώντας την επιλογή UNION ALL

Τα ερωτήματα συνένωσης στην Access περιλαμβάνουν από προεπιλογή μόνο διαφορετικές εγγραφές. Τι γίνεται όμως αν θέλετε να συμπεριλάβετε όλες τις εγγραφές; Ένα άλλο παράδειγμα μπορεί να είναι χρήσιμο εδώ.

Στην προηγούμενη ενότητα, σας δείξαμε πώς μπορείτε να δημιουργήσετε ένα σύνολο σε ένα ερώτημα συνένωσης. Τροποποιήστε αυτό το ερώτημα SQL συνένωσης για να συμπεριλάβετε Product ID = 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 που περιγράφει αυτό το σενάριο.

  1. Δημιουργήστε ένα απλό ερώτημα επιλογής χρησιμοποιώντας αυτή τη SQL σύνταξη:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
    
  2. Κάντε εναλλαγή στην προβολή φύλλου δεδομένων και θα πρέπει να δείτε τα εξής αποτελέσματα:

    Πόλη Φίλτρο
    Πειραιάς Πειραιάς
    Καλαμάτα Καλαμάτα
    Βόλος Βόλος
    Ηράκλειο Ηράκλειο
    Πειραιάς Πειραιάς
    Βόλος Βόλος
    Πειραιάς Πειραιάς
    Βόλος Βόλος
    Πειραιάς Πειραιάς
  3. Εξετάζοντας αυτά τα αποτελέσματα μπορεί να μην εμφανίζονται πολλές τιμές. Αναπτύξτε το ερώτημα, ωστόσο, και μετατρέψτε το σε ερώτημα συνένωσης, χρησιμοποιώντας τα εξής SQL:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
    
  4. Κάντε εναλλαγή στην προβολή φύλλου δεδομένων και θα πρέπει να δείτε τα εξής αποτελέσματα:

    Πόλη Φίλτρο
    <Όλα> *
    Καλαμάτα Καλαμάτα
    Ηράκλειο Ηράκλειο
    Βόλος Βόλος
    Πειραιάς Πειραιάς

    Η Access εκτελεί συνένωση από τις εννέα εγγραφές, που εμφανιζόταν προηγουμένως, με σταθερές τιμές πεδίων "Όλες<>" και "*". Επειδή αυτός ο όρος συνένωσης δεν περιέχει UNION ALL, η Access επιστρέφει μόνο διαφορετικές εγγραφές. Αυτό σημαίνει ότι κάθε πόλη επιστρέφεται μόνο μία φορά με σταθερές πανομοιότυπες τιμές.

  5. Τώρα που έχετε ένα ολοκληρωμένο ερώτημα συνένωσης που εμφανίζει το όνομα της κάθε πόλης μόνο μία φορά, μαζί με την επιλογή που επιλέγει όλες τις πόλεις, μπορείτε να χρησιμοποιήσετε αυτό το ερώτημα ως προέλευση εγγραφών για ένα σύνθετο πλαίσιο σε μια φόρμα. Χρησιμοποιώντας αυτό το συγκεκριμένο παράδειγμα ως μοντέλο, μπορείτε να δημιουργήσετε ένα στοιχείο ελέγχου σύνθετου πλαισίου σε μια φόρμα, να ορίσετε αυτό το ερώτημα ως προέλευση εγγραφών, να ορίσετε την ιδιότητα "Πλάτος στήλης" της στήλης "Φίλτρο" σε 0 (μηδέν) για να την αποκρύψετε οπτικά και, στη συνέχεια, να ορίσετε τη στήλη "Δεσμευμένη στήλη" σε 1, για να υποδείξετε το ευρετήριο από τη δεύτερη στήλη. Στην Filter ιδιότητα της ίδιας της φόρμας, μπορείτε να προσθέσετε, στη συνέχεια, κώδικα, όπως ο ακόλουθος, για να ενεργοποιήσετε ένα φίλτρο φόρμας χρησιμοποιώντας την τιμή που επιλέξατε στο στοιχείο ελέγχου του σύνθετου πλαισίου:

    Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'"
    Me.FilterOn = True
    

    Ο χρήστης της φόρμας μπορεί, στη συνέχεια, να φιλτράρει τις εγγραφές της φόρμας σε ένα συγκεκριμένο όνομα πόλης ή να επιλέξει την επιλογή <"Όλα"> για να εμφανίσει όλες τις εγγραφές για όλες τις πόλεις.

Αρχή της σελίδας