🧚 Ακούστε! Το Beekeeper Studio είναι ένα γρήγορο, μοντέρνο και ανοιχτού κώδικα GUI βάσης δεδομένων Λήψη
January 9, 2026 Από Matthew Rathbone

Η εύρεση διπλοτύπων σε SQL μπορεί να είναι μια κουραστική εργασία, αλλά είναι απαραίτητη δεξιότητα για όποιον εργάζεται με βάσεις δεδομένων. Τα διπλότυπα μπορούν να προκαλέσουν σφάλματα, αποκλίσεις και ασυνέπειες στα δεδομένα σας, οδηγώντας σε λανθασμένα αποτελέσματα και κακή απόδοση. Επομένως, είναι κρίσιμο να εντοπίζετε και να αφαιρείτε τα διπλότυπα από τους πίνακές σας για να εξασφαλίσετε την ακεραιότητα και την ακρίβεια των δεδομένων.

Η SQL παρέχει διάφορους τρόπους για να βρείτε διπλότυπα στα δεδομένα σας, ανάλογα με τις απαιτήσεις σας και τη δομή των πινάκων σας. Μπορείτε να χρησιμοποιήσετε τις ρήτρες GROUP BY και HAVING για να ομαδοποιήσετε εγγραφές ανά συγκεκριμένη στήλη και να φιλτράρετε τα διπλότυπα με βάση μια μέτρηση ή συνθήκη. Εναλλακτικά, μπορείτε να χρησιμοποιήσετε τη λέξη-κλειδί DISTINCT για να επιλέξετε μόνο μοναδικές τιμές και να τις συγκρίνετε με τον αρχικό πίνακα για να εντοπίσετε διπλότυπα. Υπάρχουν επίσης εξειδικευμένες συναρτήσεις και τελεστές, όπως COUNT(), EXISTS και JOIN, που μπορούν να σας βοηθήσουν να βρείτε διπλότυπα σε πιο σύνθετα σενάρια.

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

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

Εύρεση Διπλοτύπων με τις Ρήτρες GROUP BY και HAVING

Ένας τρόπος για να βρείτε διπλές τιμές σε SQL είναι χρησιμοποιώντας τις ρήτρες GROUP BY και HAVING. Αυτές οι ρήτρες σας επιτρέπουν να ομαδοποιήσετε γραμμές που έχουν τις ίδιες τιμές σε μία ή περισσότερες στήλες και στη συνέχεια να φιλτράρετε τις ομάδες με βάση ορισμένα κριτήρια. Δείτε πώς λειτουργεί:

  1. Ξεκινήστε επιλέγοντας τις στήλες που θέλετε να ελέγξετε για διπλότυπα χρησιμοποιώντας την εντολή SELECT.
  2. Χρησιμοποιήστε τη ρήτρα GROUP BY για να ομαδοποιήσετε τις γραμμές κατά τις επιλεγμένες στήλες.
  3. Χρησιμοποιήστε τη συνάρτηση COUNT στη ρήτρα HAVING για να φιλτράρετε τις ομάδες που έχουν περισσότερες από μία γραμμές. Αυτές είναι οι ομάδες που περιέχουν διπλότυπα.

Για παράδειγμα, ας υποθέσουμε ότι έχετε έναν πίνακα που ονομάζεται “customers” με στήλες για “name” και “email”. Θέλετε να βρείτε όλους τους πελάτες που έχουν εγγραφεί με την ίδια διεύθυνση email. Δείτε πώς θα είναι το ερώτημα SQL:

SELECT name, email, COUNT(*)
FROM customers
GROUP BY email
HAVING COUNT(*) > 1;

Αυτό το ερώτημα ομαδοποιεί τους πελάτες κατά τις διευθύνσεις email τους και στη συνέχεια μετράει τον αριθμό των πελατών σε κάθε ομάδα. Η ρήτρα HAVING φιλτράρει τις ομάδες που έχουν μόνο έναν πελάτη, αφήνοντας μόνο τις ομάδες με διπλές διευθύνσεις email.

Δοκιμάστε το μόνοι σας:

[[ expanded ? '▼' : '▶' ]]

[[ testData.title ]]

Κάντε ερώτημα στον πίνακα users για να βρείτε όλες τις διευθύνσεις email που εμφανίζονται περισσότερο από μία φορά. Επιστρέψτε το email και το count για το πόσες φορές εμφανίζεται κάθε διπλό email.

Διαδραστικό Παράδειγμα ✓ Ολοκληρώθηκε
Αναμενόμενες στήλες: [[ col ]]
ℹ️ Αυτή η άσκηση επαναφέρει τη βάση δεδομένων σε κάθε εκτέλεση. Γράψτε την πλήρη λύση σας σε μία υποβολή.
[[ i18n.correct ]] [[ validationResult ? i18n.all_checks_passed : i18n.query_success ]]
[[ detail.message ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.not_quite_right ]] [[ patternError ]] [[ validationResult.error ]] [[ i18n.results_dont_match ]]
[[ detail.passed ? '✓' : '✗' ]] [[ detail.message ]]
[[ i18n.your_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.expected_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.sql_error ]]
[[ error ]]
💡 [[ i18n.hint_label ]] [[ testData.hint ]]
📊 [[ i18n.expected_result_label ]]
[[ col ]]
[[ formatCell(cell) ]]
✨ [[ i18n.solution_label ]]
[[ testData.solution ]]
Διαθέσιμοι Πίνακες
[[ table.name ]]
[[ col ]]
[[ formatCell(cell) ]]

Είναι σημαντικό να σημειωθεί ότι η ρήτρα GROUP BY πρέπει να περιλαμβάνει όλες τις στήλες που επιλέγετε εκτός από αυτές που χρησιμοποιούν μια συγκεντρωτική συνάρτηση όπως η COUNT. Διαφορετικά, το ερώτημα θα επιστρέψει σφάλμα.

Ένα άλλο πράγμα που πρέπει να έχετε κατά νου είναι ότι η συνάρτηση COUNT μετράει όλες τις γραμμές σε κάθε ομάδα, όχι μόνο τις μοναδικές. Έτσι, αν έχετε πολλές γραμμές με το ίδιο όνομα και διεύθυνση email, όλες θα μετρηθούν ως διπλότυπα.

Εκτός από τη χρήση των ρητρών GROUP BY και HAVING, μπορείτε επίσης να χρησιμοποιήσετε άλλες εντολές SQL όπως ORDER BY, WHERE και JOIN για να βελτιώσετε περαιτέρω την αναζήτησή σας για διπλότυπα. Μπορείτε επίσης να χρησιμοποιήσετε μοναδικούς περιορισμούς για να αποτρέψετε την εισαγωγή διπλών τιμών σε έναν πίνακα εξαρχής.

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

Χρήση της Συνάρτησης COUNT

Ένας τρόπος για να βρείτε διπλότυπα σε SQL είναι χρησιμοποιώντας τη συνάρτηση COUNT. Η συνάρτηση COUNT είναι μια συγκεντρωτική συνάρτηση που μετράει τον αριθμό των γραμμών σε έναν πίνακα που πληρούν μια συγκεκριμένη συνθήκη. Χρησιμοποιώντας τη συνάρτηση COUNT, μπορείτε να μετρήσετε τον αριθμό των εμφανίσεων μιας συγκεκριμένης τιμής σε μια στήλη και να εντοπίσετε διπλότυπα.

Για να χρησιμοποιήσετε τη συνάρτηση COUNT για να βρείτε διπλότυπα, θα χρειαστεί να ομαδοποιήσετε τις γραμμές κατά τη στήλη που θέλετε να ελέγξετε για διπλότυπα. Η ρήτρα GROUP BY χρησιμοποιείται για να ομαδοποιήσει τις γραμμές με βάση τις τιμές σε μια συγκεκριμένη στήλη. Για παράδειγμα, αν θέλετε να βρείτε διπλότυπα στη στήλη “email” ενός πίνακα “users”, θα ομαδοποιούσατε τις γραμμές κατά τη στήλη “email”.

Ακολουθεί ένα παράδειγμα ερωτήματος που χρησιμοποιεί τη συνάρτηση COUNT για να βρει διπλότυπα στη στήλη “email” ενός πίνακα “users”:

SELECT email, COUNT(email) as count
FROM users
GROUP BY email
HAVING COUNT(email) > 1;

Σε αυτό το ερώτημα, η ρήτρα GROUP BY ομαδοποιεί τις γραμμές κατά τη στήλη “email” και η συνάρτηση COUNT μετράει τον αριθμό των εμφανίσεων κάθε διεύθυνσης email. Η ρήτρα HAVING φιλτράρει τα αποτελέσματα για να εμφανίσει μόνο τις διευθύνσεις email που έχουν περισσότερες από μία εμφανίσεις.

Το αποτέλεσμα αυτού του ερωτήματος θα είναι ένας πίνακας που εμφανίζει τις διευθύνσεις email που έχουν διπλότυπα και τον αριθμό εμφανίσεων κάθε διεύθυνσης email. Μπορείτε να χρησιμοποιήσετε αυτές τις πληροφορίες για να εντοπίσετε και να αφαιρέσετε τις διπλές γραμμές από τον πίνακα.

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

Χρήση της Ρήτρας INNER JOIN

Ένας από τους πιο συνηθισμένους τρόπους για να βρείτε διπλότυπα σε SQL είναι χρησιμοποιώντας τη ρήτρα INNER JOIN. Αυτή η ρήτρα σας επιτρέπει να συνδυάσετε δύο ή περισσότερους πίνακες με βάση μια κοινή στήλη και να επιστρέψετε μόνο τις γραμμές που έχουν αντίστοιχες τιμές και στους δύο πίνακες.

Για να χρησιμοποιήσετε τη ρήτρα INNER JOIN για να βρείτε διπλότυπα, θα χρειαστεί να εντοπίσετε τις στήλες που περιέχουν τα διπλά δεδομένα. Μόλις εντοπίσετε αυτές τις στήλες, μπορείτε να χρησιμοποιήσετε τη ρήτρα INNER JOIN για να συνδέσετε τον πίνακα σε αυτές τις στήλες.

Ακολουθεί ένα παράδειγμα για το πώς να χρησιμοποιήσετε τη ρήτρα INNER JOIN για να βρείτε διπλότυπα σε έναν πίνακα που ονομάζεται “orders”:

SELECT o1.order_id, o2.order_id
FROM orders o1
INNER JOIN orders o2
ON o1.customer_id = o2.customer_id
AND o1.order_date = o2.order_date
AND o1.order_id <> o2.order_id;

Σε αυτό το παράδειγμα, η ρήτρα INNER JOIN χρησιμοποιείται για να συνδέσει τον πίνακα “orders” με τον εαυτό του, χρησιμοποιώντας τις στήλες “customer_id” και “order_date” ως κριτήρια σύνδεσης. Ο τελεστής “AND” χρησιμοποιείται για να καθορίσει ότι και οι τρεις στήλες πρέπει να ταιριάζουν για να επιστραφεί μια γραμμή. Η τελευταία γραμμή του ερωτήματος, “AND o1.order_id <> o2.order_id”, διασφαλίζει ότι το ερώτημα δεν επιστρέφει γραμμές όπου και οι δύο τιμές “order_id” είναι ίδιες.

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

Εξασκηθείτε με self-joins:

[[ expanded ? '▼' : '▶' ]]

[[ testData.title ]]

Κάντε ερώτημα στον πίνακα products για να βρείτε όλες τις διπλές εγγραφές προϊόντων (ίδιο product_name και category). Επιστρέψτε το product_id, product_name, category και price μόνο για τις διπλές εγγραφές (όχι την πρώτη εμφάνιση).

Διαδραστικό Παράδειγμα ✓ Ολοκληρώθηκε
Αναμενόμενες στήλες: [[ col ]]
ℹ️ Αυτή η άσκηση επαναφέρει τη βάση δεδομένων σε κάθε εκτέλεση. Γράψτε την πλήρη λύση σας σε μία υποβολή.
[[ i18n.correct ]] [[ validationResult ? i18n.all_checks_passed : i18n.query_success ]]
[[ detail.message ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.not_quite_right ]] [[ patternError ]] [[ validationResult.error ]] [[ i18n.results_dont_match ]]
[[ detail.passed ? '✓' : '✗' ]] [[ detail.message ]]
[[ i18n.your_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.expected_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.sql_error ]]
[[ error ]]
💡 [[ i18n.hint_label ]] [[ testData.hint ]]
📊 [[ i18n.expected_result_label ]]
[[ col ]]
[[ formatCell(cell) ]]
✨ [[ i18n.solution_label ]]
[[ testData.solution ]]
Διαθέσιμοι Πίνακες
[[ table.name ]]
[[ col ]]
[[ formatCell(cell) ]]

Η χρήση της ρήτρας INNER JOIN με αυτόν τον τρόπο μπορεί να είναι ένα ισχυρό εργαλείο για την εύρεση διπλοτύπων σε SQL. Ωστόσο, είναι σημαντικό να είστε προσεκτικοί όταν χρησιμοποιείτε αυτή τη μέθοδο, καθώς μπορεί εύκολα να επιστραφούν κατά λάθος ψευδώς θετικά αποτελέσματα ή να χαθούν διπλότυπα που είναι διασκορπισμένα σε πολλούς πίνακες. Είναι πάντα καλή ιδέα να ελέγχετε ξανά τα αποτελέσματά σας και να χρησιμοποιείτε άλλες μεθόδους, όπως τις ρήτρες GROUP BY και HAVING, για να επιβεβαιώσετε τα ευρήματά σας.

Δοκιμάστε το μόνοι σας:

[[ expanded ? '▼' : '▶' ]]

[[ testData.title ]]

Κάντε ερώτημα στον πίνακα customers για να επιστρέψετε τις πλήρεις εγγραφές πελατών (name και email) για πελάτες των οποίων το email εμφανίζεται περισσότερο από μία φορά. Χρησιμοποιήστε υποερώτημα για να εντοπίσετε διπλά emails.

Διαδραστικό Παράδειγμα ✓ Ολοκληρώθηκε
Αναμενόμενες στήλες: [[ col ]]
ℹ️ Αυτή η άσκηση επαναφέρει τη βάση δεδομένων σε κάθε εκτέλεση. Γράψτε την πλήρη λύση σας σε μία υποβολή.
[[ i18n.correct ]] [[ validationResult ? i18n.all_checks_passed : i18n.query_success ]]
[[ detail.message ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.not_quite_right ]] [[ patternError ]] [[ validationResult.error ]] [[ i18n.results_dont_match ]]
[[ detail.passed ? '✓' : '✗' ]] [[ detail.message ]]
[[ i18n.your_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.expected_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.sql_error ]]
[[ error ]]
💡 [[ i18n.hint_label ]] [[ testData.hint ]]
📊 [[ i18n.expected_result_label ]]
[[ col ]]
[[ formatCell(cell) ]]
✨ [[ i18n.solution_label ]]
[[ testData.solution ]]
Διαθέσιμοι Πίνακες
[[ table.name ]]
[[ col ]]
[[ formatCell(cell) ]]

Εύρεση Διπλών Ζευγών με Self-Joins

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

Ένα self-join περιλαμβάνει τη σύνδεση ενός πίνακα με τον εαυτό του χρησιμοποιώντας διαφορετικά ψευδώνυμα. Συνδέοντας στις στήλες που ορίζουν τα διπλότυπα και διασφαλίζοντας ότι δεν ταιριάζετε μια εγγραφή με τον εαυτό της, μπορείτε να εντοπίσετε αποτελεσματικά τα διπλά ζεύγη.

Για παράδειγμα, αν έχετε έναν πίνακα συναλλαγών και θέλετε να βρείτε ζεύγη συναλλαγών με το ίδιο αναγνωριστικό πελάτη και ποσό αλλά διαφορετικά αναγνωριστικά συναλλαγής, μπορείτε να χρησιμοποιήσετε ένα self-join όπως αυτό:

SELECT t1.transaction_id as transaction_id1, 
       t2.transaction_id as transaction_id2, 
       t1.customer_id, 
       t1.amount
FROM transactions t1
INNER JOIN transactions t2 
ON t1.customer_id = t2.customer_id 
AND t1.amount = t2.amount 
AND t1.transaction_id < t2.transaction_id;

Τα βασικά σημεία σε αυτό το ερώτημα είναι:

  • Τα t1 και t2 είναι ψευδώνυμα για τον ίδιο πίνακα
  • Οι συνθήκες σύνδεσης καθορίζουν τι κάνει τις εγγραφές “διπλότυπα” (customer_id και amount)
  • Το t1.transaction_id < t2.transaction_id διασφαλίζει ότι παίρνουμε κάθε ζεύγος μόνο μία φορά και δεν ταιριάζουμε μια εγγραφή με τον εαυτό της

Δοκιμάστε το μόνοι σας:

[[ expanded ? '▼' : '▶' ]]

[[ testData.title ]]

Κάντε ερώτημα στον πίνακα transactions για να βρείτε ζεύγη συναλλαγών που έχουν το ίδιο customer_id και amount αλλά διαφορετικό transaction_id. Επιστρέψτε transaction_id1, transaction_id2, customer_id και amount για κάθε διπλό ζεύγος. Εμφανίστε κάθε ζεύγος μόνο μία φορά (αποφύγετε να εμφανίσετε τόσο το A-B όσο και το B-A).

Διαδραστικό Παράδειγμα ✓ Ολοκληρώθηκε
Αναμενόμενες στήλες: [[ col ]]
ℹ️ Αυτή η άσκηση επαναφέρει τη βάση δεδομένων σε κάθε εκτέλεση. Γράψτε την πλήρη λύση σας σε μία υποβολή.
[[ i18n.correct ]] [[ validationResult ? i18n.all_checks_passed : i18n.query_success ]]
[[ detail.message ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.not_quite_right ]] [[ patternError ]] [[ validationResult.error ]] [[ i18n.results_dont_match ]]
[[ detail.passed ? '✓' : '✗' ]] [[ detail.message ]]
[[ i18n.your_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.expected_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.sql_error ]]
[[ error ]]
💡 [[ i18n.hint_label ]] [[ testData.hint ]]
📊 [[ i18n.expected_result_label ]]
[[ col ]]
[[ formatCell(cell) ]]
✨ [[ i18n.solution_label ]]
[[ testData.solution ]]
Διαθέσιμοι Πίνακες
[[ table.name ]]
[[ col ]]
[[ formatCell(cell) ]]

Εύρεση Διπλοτύπων με Common Table Expressions (CTE)

Ένας από τους τρόπους για να βρείτε διπλότυπα σε SQL είναι χρησιμοποιώντας τις Common Table Expressions (CTE). Μια CTE είναι ένα προσωρινό σύνολο αποτελεσμάτων που ορίζεται εντός του πεδίου εκτέλεσης μιας μεμονωμένης εντολής SELECT, INSERT, UPDATE, DELETE ή CREATE VIEW.

Για να βρείτε διπλότυπα χρησιμοποιώντας CTE, μπορείτε να χρησιμοποιήσετε τη συνάρτηση ROW_NUMBER(), η οποία αποδίδει έναν μοναδικό διαδοχικό αριθμό σε κάθε γραμμή εντός ενός διαμερίσματος ενός συνόλου αποτελεσμάτων. Η ρήτρα PARTITION BY καθορίζει τις στήλες που χρησιμοποιούνται για τον ορισμό του διαμερίσματος και η ρήτρα ORDER BY καθορίζει τη σειρά των γραμμών εντός κάθε διαμερίσματος.

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

WITH CTE AS (
   SELECT column1, column2, column3, ROW_NUMBER() OVER(PARTITION BY column1, column2, column3 ORDER BY column1, column2, column3) AS RowNumber
   FROM table_name
)
SELECT *
FROM CTE
WHERE RowNumber > 1

Σε αυτό το παράδειγμα, η CTE ορίζεται με τις στήλες που πρέπει να ελεγχθούν για διπλότυπα. Η συνάρτηση ROW_NUMBER() χρησιμοποιείται για να δημιουργήσει έναν αριθμό ακολουθίας για κάθε γραμμή εντός ενός διαμερίσματος του συνόλου αποτελεσμάτων, όπου το διαμέρισμα ορίζεται από τις στήλες που καθορίζονται στη ρήτρα PARTITION BY. Το σύνολο αποτελεσμάτων στη συνέχεια φιλτράρεται για να εμφανίσει μόνο τις γραμμές όπου το RowNumber είναι μεγαλύτερο από 1, υποδεικνύοντας ότι υπάρχουν διπλότυπα.

Είναι σημαντικό να σημειωθεί ότι η ρήτρα ORDER BY εντός της συνάρτησης ROW_NUMBER() πρέπει να ταιριάζει με τη ρήτρα ORDER BY στην κύρια εντολή SELECT, διαφορετικά τα αποτελέσματα μπορεί να μην είναι ακριβή.

Η χρήση CTE για την εύρεση διπλοτύπων μπορεί να είναι ιδιαίτερα χρήσιμη στον SQL Server 2017, ο οποίος εισήγαγε υποστήριξη για επεξεργασία γράφων χρησιμοποιώντας Common Table Expressions. Αυτό επιτρέπει πιο σύνθετα ερωτήματα που περιλαμβάνουν σχέσεις μεταξύ δεδομένων.

Συνολικά, η χρήση CTE για την εύρεση διπλοτύπων σε SQL μπορεί να είναι ένα ισχυρό εργαλείο για την ανάλυση και διαχείριση δεδομένων.

Δοκιμάστε το μόνοι σας:

[[ expanded ? '▼' : '▶' ]]

[[ testData.title ]]

Κάντε ερώτημα στον πίνακα products χρησιμοποιώντας μια Common Table Expression (CTE) για να βρείτε διπλά ονόματα προϊόντων. Η CTE πρέπει να ομαδοποιήσει κατά όνομα προϊόντος και να μετρήσει τις εμφανίσεις, μετά να επιλέξει προϊόντα με μέτρηση > 1.

Διαδραστικό Παράδειγμα ✓ Ολοκληρώθηκε
Αναμενόμενες στήλες: [[ col ]]
ℹ️ Αυτή η άσκηση επαναφέρει τη βάση δεδομένων σε κάθε εκτέλεση. Γράψτε την πλήρη λύση σας σε μία υποβολή.
[[ i18n.correct ]] [[ validationResult ? i18n.all_checks_passed : i18n.query_success ]]
[[ detail.message ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.not_quite_right ]] [[ patternError ]] [[ validationResult.error ]] [[ i18n.results_dont_match ]]
[[ detail.passed ? '✓' : '✗' ]] [[ detail.message ]]
[[ i18n.your_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.expected_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.sql_error ]]
[[ error ]]
💡 [[ i18n.hint_label ]] [[ testData.hint ]]
📊 [[ i18n.expected_result_label ]]
[[ col ]]
[[ formatCell(cell) ]]
✨ [[ i18n.solution_label ]]
[[ testData.solution ]]
Διαθέσιμοι Πίνακες
[[ table.name ]]
[[ col ]]
[[ formatCell(cell) ]]

Εύρεση Διπλοτύπων με Συναρτήσεις Παραθύρου

Όταν πρόκειται για την εύρεση διπλοτύπων σε SQL, ένας από τους πιο αποτελεσματικούς τρόπους είναι η χρήση συναρτήσεων παραθύρου. Οι συναρτήσεις παραθύρου είναι ένα ισχυρό εργαλείο που μπορεί να χρησιμοποιηθεί για να εκτελέσει υπολογισμούς σε ένα σύνολο γραμμών που σχετίζονται με την τρέχουσα γραμμή.

Για να βρείτε διπλότυπα χρησιμοποιώντας συναρτήσεις παραθύρου, μπορείτε να χρησιμοποιήσετε τη συνάρτηση ROW_NUMBER() σε συνδυασμό με μια ρήτρα PARTITION BY. Η συνάρτηση ROW_NUMBER() αποδίδει έναν μοναδικό αριθμό σε κάθε γραμμή εντός ενός διαμερίσματος και η ρήτρα PARTITION BY ομαδοποιεί τις γραμμές σε διαμερίσματα με βάση μια συγκεκριμένη στήλη ή σύνολο στηλών.

Για παράδειγμα, ας υποθέσουμε ότι έχετε έναν πίνακα χρηστών που περιλαμβάνει στήλες για user_id, username και email. Για να βρείτε όλους τους χρήστες που έχουν διπλά emails, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή select:

SELECT user_id, username, email
FROM (
  SELECT user_id, username, email,
    ROW_NUMBER() OVER (PARTITION BY email ORDER BY user_id) AS row_num
  FROM users
) AS subquery
WHERE row_num > 1;

Σε αυτό το παράδειγμα, η ρήτρα PARTITION BY διαμερίζει τις γραμμές κατά τη στήλη email και η συνάρτηση ROW_NUMBER() αποδίδει έναν μοναδικό αριθμό σε κάθε γραμμή εντός του διαμερίσματος με βάση τη στήλη user_id. Η ρήτρα WHERE φιλτράρει όλες τις γραμμές εκτός από αυτές με row_num μεγαλύτερο από 1, που είναι οι γραμμές με διπλά emails.

Εξασκηθείτε με ROW_NUMBER():

[[ expanded ? '▼' : '▶' ]]

[[ testData.title ]]

Κάντε ερώτημα στον πίνακα customers για να επιστρέψετε τις πλήρεις εγγραφές πελατών (name και email) για πελάτες των οποίων το email εμφανίζεται περισσότερο από μία φορά. Χρησιμοποιήστε υποερώτημα για να εντοπίσετε διπλά emails.

Διαδραστικό Παράδειγμα ✓ Ολοκληρώθηκε
Αναμενόμενες στήλες: [[ col ]]
ℹ️ Αυτή η άσκηση επαναφέρει τη βάση δεδομένων σε κάθε εκτέλεση. Γράψτε την πλήρη λύση σας σε μία υποβολή.
[[ i18n.correct ]] [[ validationResult ? i18n.all_checks_passed : i18n.query_success ]]
[[ detail.message ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.not_quite_right ]] [[ patternError ]] [[ validationResult.error ]] [[ i18n.results_dont_match ]]
[[ detail.passed ? '✓' : '✗' ]] [[ detail.message ]]
[[ i18n.your_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.expected_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.sql_error ]]
[[ error ]]
💡 [[ i18n.hint_label ]] [[ testData.hint ]]
📊 [[ i18n.expected_result_label ]]
[[ col ]]
[[ formatCell(cell) ]]
✨ [[ i18n.solution_label ]]
[[ testData.solution ]]
Διαθέσιμοι Πίνακες
[[ table.name ]]
[[ col ]]
[[ formatCell(cell) ]]

Είναι σημαντικό να σημειωθεί ότι οι συναρτήσεις παραθύρου μπορούν να χρησιμοποιηθούν σε συνδυασμό με άλλες συναρτήσεις SQL, όπως εντολές CASE και συγκεντρωτικές συναρτήσεις, για τη δημιουργία πιο σύνθετων ερωτημάτων. Για παράδειγμα, θα μπορούσατε να χρησιμοποιήσετε μια εντολή CASE για να ομαδοποιήσετε τις γραμμές σε μια συγκεκριμένη κατηγορία και στη συνέχεια να χρησιμοποιήσετε μια συνάρτηση παραθύρου για να βρείτε διπλότυπα εντός αυτής της κατηγορίας.

Συμπερασματικά, η χρήση συναρτήσεων παραθύρου για την εύρεση διπλοτύπων σε SQL μπορεί να είναι μια ισχυρή και αποτελεσματική μέθοδος. Χρησιμοποιώντας τη συνάρτηση ROW_NUMBER() σε συνδυασμό με μια ρήτρα PARTITION BY, μπορείτε εύκολα να ομαδοποιήσετε τις γραμμές σε διαμερίσματα και να αποδώσετε μοναδικούς αριθμούς σε κάθε γραμμή εντός του διαμερίσματος. Αυτό σας επιτρέπει να εντοπίσετε και να αφαιρέσετε γρήγορα τις διπλές γραμμές από τα αποτελέσματά σας.

Δοκιμάστε το μόνοι σας:

[[ expanded ? '▼' : '▶' ]]

[[ testData.title ]]

Κάντε ερώτημα στον πίνακα products για να βρείτε όλες τις διπλές εγγραφές προϊόντων (ίδιο product_name και category). Επιστρέψτε το product_id, product_name, category και price μόνο για τις διπλές εγγραφές (όχι την πρώτη εμφάνιση).

Διαδραστικό Παράδειγμα ✓ Ολοκληρώθηκε
Αναμενόμενες στήλες: [[ col ]]
ℹ️ Αυτή η άσκηση επαναφέρει τη βάση δεδομένων σε κάθε εκτέλεση. Γράψτε την πλήρη λύση σας σε μία υποβολή.
[[ i18n.correct ]] [[ validationResult ? i18n.all_checks_passed : i18n.query_success ]]
[[ detail.message ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.not_quite_right ]] [[ patternError ]] [[ validationResult.error ]] [[ i18n.results_dont_match ]]
[[ detail.passed ? '✓' : '✗' ]] [[ detail.message ]]
[[ i18n.your_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.expected_results ]]
[[ col ]]
[[ formatCell(cell) ]]
[[ i18n.sql_error ]]
[[ error ]]
💡 [[ i18n.hint_label ]] [[ testData.hint ]]
📊 [[ i18n.expected_result_label ]]
[[ col ]]
[[ formatCell(cell) ]]
✨ [[ i18n.solution_label ]]
[[ testData.solution ]]
Διαθέσιμοι Πίνακες
[[ table.name ]]
[[ col ]]
[[ formatCell(cell) ]]

Χρήση της Συνάρτησης ROW_NUMBER() με τη Ρήτρα PARTITION BY

Κατά την αναζήτηση διπλοτύπων σε μια βάση δεδομένων SQL, ένα χρήσιμο εργαλείο είναι η συνάρτηση ROW_NUMBER() με τη ρήτρα PARTITION BY. Αυτή η συνάρτηση αποδίδει έναν μοναδικό αριθμό σε κάθε γραμμή σε ένα σύνολο αποτελεσμάτων, με βάση τα καθορισμένα κριτήρια διαμερισμού.

Η ρήτρα PARTITION BY επιτρέπει στον χρήστη να ομαδοποιήσει τις γραμμές σε διαμερίσματα με βάση μία ή περισσότερες στήλες. Αυτό σημαίνει ότι η συνάρτηση ROW_NUMBER() θα αποδώσει έναν μοναδικό αριθμό σε κάθε γραμμή εντός κάθε διαμερίσματος, αντί σε ολόκληρο το σύνολο αποτελεσμάτων.

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

SELECT order_id, customer_id, order_date,
       ROW_NUMBER() OVER (PARTITION BY customer_id, order_date
                          ORDER BY order_id) AS row_num
FROM orders

Σε αυτό το ερώτημα, η συνάρτηση ROW_NUMBER() χρησιμοποιείται με τη ρήτρα PARTITION BY για να ομαδοποιήσει τις παραγγελίες κατά πελάτη και ημερομηνία παραγγελίας. Η συνάρτηση στη συνέχεια αποδίδει έναν μοναδικό αριθμό σε κάθε γραμμή εντός κάθε διαμερίσματος, με βάση το αναγνωριστικό παραγγελίας.

Ο προκύπτων πίνακας θα έχει μια επιπλέον στήλη που ονομάζεται “row_num” που περιέχει τους αποδιδόμενους αριθμούς γραμμών. Τα διπλότυπα μπορούν στη συνέχεια να εντοπιστούν επιλέγοντας γραμμές με row_num μεγαλύτερο από 1.

Η χρήση της συνάρτησης ROW_NUMBER() με τη ρήτρα PARTITION BY μπορεί να είναι ένα ισχυρό εργαλείο για την εύρεση διπλοτύπων σε βάσεις δεδομένων SQL. Ομαδοποιώντας τις γραμμές σε διαμερίσματα με βάση συγκεκριμένα κριτήρια, η συνάρτηση μπορεί να αποδώσει μοναδικούς αριθμούς σε κάθε γραμμή εντός κάθε διαμερίσματος, καθιστώντας ευκολότερο τον εντοπισμό διπλοτύπων.

Χρήση της Εντολής CASE με τη Συνάρτηση ROW_NUMBER()

Στην SQL, η συνάρτηση ROW_NUMBER() χρησιμοποιείται για να αποδώσει έναν μοναδικό διαδοχικό αριθμό σε κάθε γραμμή σε ένα σύνολο αποτελεσμάτων. Αυτή η συνάρτηση μπορεί να χρησιμοποιηθεί σε συνδυασμό με την εντολή CASE για τον εντοπισμό διπλών εγγραφών σε έναν πίνακα.

Η εντολή CASE επιτρέπει την εφαρμογή υπό συνθήκη λογικής σε κάθε γραμμή σε ένα σύνολο αποτελεσμάτων. Χρησιμοποιώντας τη συνάρτηση ROW_NUMBER() εντός της εντολής CASE, μπορεί να προσδιοριστεί ο αριθμός των εμφανίσεων κάθε εγγραφής.

Για παράδειγμα, το ακόλουθο ερώτημα SQL μπορεί να χρησιμοποιηθεί για να βρει διπλές εγγραφές σε έναν πίνακα “users” με βάση τις στήλες “first_name” και “last_name”:

SELECT *,
CASE
    WHEN ROW_NUMBER() OVER (PARTITION BY first_name, last_name ORDER BY id) > 1
    THEN 'Διπλότυπο'
    ELSE 'Μοναδικό'
END AS duplicate_status
FROM users;

Το παραπάνω ερώτημα διαμερίζει το σύνολο αποτελεσμάτων κατά τις στήλες “first_name” και “last_name” και ταξινομεί τις γραμμές κατά τη στήλη “id”. Η συνάρτηση ROW_NUMBER() αποδίδει έναν μοναδικό διαδοχικό αριθμό σε κάθε γραμμή εντός κάθε διαμερίσματος.

Η εντολή CASE στη συνέχεια ελέγχει αν η τιμή ROW_NUMBER() είναι μεγαλύτερη από 1. Αν ναι, τότε η γραμμή αναγνωρίζεται ως διπλότυπο. Αν όχι, η γραμμή αναγνωρίζεται ως μοναδική.

Το σύνολο αποτελεσμάτων θα περιλαμβάνει μια επιπλέον στήλη που ονομάζεται “duplicate_status” που εμφανίζει είτε “Διπλότυπο” είτε “Μοναδικό” για κάθε γραμμή.

id first_name last_name email duplicate_status
1 John Smith john@example.com Μοναδικό
2 Jane Doe jane@example.com Μοναδικό
3 John Smith john.smith@example.com Διπλότυπο
4 Bob Johnson bob@example.com Μοναδικό
5 Jane Doe jane.doe@example.com Διπλότυπο

Στο παραπάνω παράδειγμα, οι γραμμές 1, 2 και 4 αναγνωρίζονται ως μοναδικές, ενώ οι γραμμές 3 και 5 αναγνωρίζονται ως διπλότυπα με βάση τις στήλες “first_name” και “last_name”.

Χρησιμοποιώντας τη συνάρτηση ROW_NUMBER() εντός της εντολής CASE, οι διπλές εγγραφές μπορούν να εντοπιστούν και να διαχειριστούν εύκολα σε έναν πίνακα SQL.

Το Beekeeper Studio Είναι Ένα Δωρεάν & Ανοιχτού Κώδικα GUI Βάσης Δεδομένων

Το καλύτερο εργαλείο SQL query & editor που έχω χρησιμοποιήσει. Παρέχει όλα όσα χρειάζομαι για να διαχειριστώ τη βάση δεδομένων μου. - ⭐⭐⭐⭐⭐ Mit

Το Beekeeper Studio είναι γρήγορο, διαισθητικό και εύκολο στη χρήση. Το Beekeeper υποστηρίζει πολλές βάσεις δεδομένων και λειτουργεί εξαιρετικά σε Windows, Mac και Linux.

Η έκδοση Linux του Beekeeper είναι 100% πλήρης, χωρίς περικοπές και χωρίς συμβιβασμούς στα χαρακτηριστικά.

Τι Λένε Οι Χρήστες Για Το Beekeeper Studio

★★★★★
"Το Beekeeper Studio αντικατέστησε εντελώς την παλιά μου ροή εργασίας SQL. Είναι γρήγορο, διαισθητικό και κάνει τη δουλειά με βάσεις δεδομένων απολαυστική ξανά."
— Alex K., Προγραμματιστής Βάσεων Δεδομένων
★★★★★
"Έχω δοκιμάσει πολλά GUIs βάσεων δεδομένων, αλλά το Beekeeper βρίσκει την τέλεια ισορροπία μεταξύ χαρακτηριστικών και απλότητας. Απλά δουλεύει."
— Sarah M., Full Stack Μηχανικός

Έτοιμοι να Βελτιώσετε τη Ροή Εργασίας σας με SQL;

download Δωρεάν Λήψη