|
Τα ερωτήματα ενός πίνακα/πολλών πινάκων SQL καταργούν διπλότυπες εγγραφές Διακριτός μονός πίνακας - select distinct 字段 from 表
Αντιγραφή κώδικα
Πολλές ψήφοι ομαδοποιούνται ανά Η ομάδα κατά πρέπει να τοποθετηθεί πριν από την παραγγελία από και όριο, διαφορετικά θα αναφερθεί σφάλμα ************************************************************************************ 1. Βρείτε τις περιττές διπλότυπες εγγραφές στον πίνακα και οι διπλότυπες εγγραφές κρίνονται με βάση ένα μόνο πεδίο (peopleId). Επιλέξτε * από άτομα όπου peopleId in (επιλέξτε peopleId από την ομάδα ατόμων κατά peopleId έχοντας count(peopleId) > 1) 2. Διαγράψτε τις περιττές διπλότυπες εγγραφές στον πίνακα και οι διπλότυπες εγγραφές κρίνονται με βάση ένα μόνο πεδίο (peopleId), αφήνοντας μόνο τις εγγραφές με το μικρότερο rowid Διαγραφή από άτομα όπου peopleId in (επιλέξτε peopleId από την ομάδα ατόμων κατά peopleId έχοντας count(peopleId) > 1) και rowid not in (επιλέξτε min(rowid) από την ομάδα ατόμων κατά peopleId έχοντας count(peopleId )>1) 3. Βρείτε περιττές διπλότυπες εγγραφές (πολλαπλά πεδία) στον πίνακα Επιλέξτε * από το βιογραφικό σημείωμα Α όπου (a.peopleId,a.seq) in (επιλέξτε peopleId,seq από την ομάδα βιογραφικών κατά peopleId,seq έχοντας count(*) > 1) 4. Διαγράψτε τις περιττές διπλότυπες εγγραφές (πολλαπλά πεδία) στον πίνακα, αφήνοντας μόνο τις εγγραφές με το μικρότερο rowid Να διαγραφεί από το βιογραφικό σημείωμα α όπου (a.peopleId,a.seq) in (επιλέξτε peopleId,seq από την ομάδα βιογραφικών κατά peopleId,seq έχοντας count(*) > 1) και rowid not in (επιλέξτε min(rowid) από την ομάδα vitae ανά peopleId,seq έχοντας count(*)>1) 5. Βρείτε περιττές διπλότυπες εγγραφές (πολλαπλά πεδία) στον πίνακα και μην περιέχουν εγγραφές με το λιγότερο rowid Επιλέξτε * από το βιογραφικό σημείωμα Α όπου (a.peopleId,a.seq) in (επιλέξτε peopleId,seq από την ομάδα βιογραφικών κατά peopleId,seq έχοντας count(*) > 1) και rowid not in (επιλέξτε min(rowid) από την ομάδα vitae ανά peopleId,seq έχοντας count(*)>1)
(δύο) Για παράδειγμα Υπάρχει ένα πεδίο "όνομα" στον πίνακα Α, Και η τιμή "όνομα" μπορεί να είναι η ίδια μεταξύ διαφορετικών εγγραφών, Τώρα πρέπει να υποβάλετε ερώτημα για στοιχεία με διπλότυπες τιμές "όνομα" μεταξύ των εγγραφών στον πίνακα. Επιλέξτε Όνομα,Πλήθος(*) Από μια ομάδα κατά όνομα που έχει Πλήθος(*) > 1 Εάν το φύλο είναι επίσης το ίδιο, είναι ως εξής: Επιλέξτε Όνομα,φύλο,Πλήθος(*) Από Μια Ομάδα Με Όνομα,Φύλο Έχοντας Πλήθος(*) > 1 (τρία) Μέθοδος 1 δηλώστε @max ακέραιο,@id ακέραιο δηλώστε cur_rows τοπικό δρομέα για επιλογή κύριου πεδίου, count(*) από ομάδα ονόματος πίνακα ανά κύριο πεδίο που έχει > count(*). 1 Ανοίξτε cur_rows φέρτε cur_rows σε @id,@max ενώ @@fetch_status=0 αρχίζω επιλέξτε @max = @max -1 Ορισμός αριθμού σειρών @max Διαγραφή από το όνομα του πίνακα όπου πρωτεύον πεδίο = @id φέρτε cur_rows σε @id,@max Τέλος κλείσιμο cur_rows Ορισμός αριθμού σειρών 0 Μέθοδος 2 Οι "διπλότυπες εγγραφές" έχουν δύο έννοιες των διπλότυπων εγγραφών, η μία είναι μια εντελώς διπλότυπη εγγραφή, δηλαδή μια εγγραφή με όλα τα πεδία διπλότυπα και η άλλη είναι μια εγγραφή με διπλότυπα μέρη βασικών πεδίων, όπως το πεδίο Όνομα είναι διπλό, ενώ άλλα πεδία δεν είναι απαραίτητα διπλότυπα ή μπορούν να αγνοηθούν. 1. Για τον πρώτο τύπο επανάληψης, είναι σχετικά εύκολο να λυθεί και να χρησιμοποιηθεί επιλέξτε διακριτό * από το tableName Μπορείτε να λάβετε το σύνολο αποτελεσμάτων χωρίς διπλότυπες εγγραφές. Εάν πρέπει να διαγράψετε διπλότυπες εγγραφές (κρατήστε 1 διπλότυπη εγγραφή), μπορείτε να τις διαγράψετε ως εξής επιλέξτε διακριτό * σε #Tmp από το tableName drop table tableName επιλέξτε * στο tableName από #Tmp drop table #Tmp Αυτή η αντιγραφή συμβαίνει λόγω κακής σχεδίασης πίνακα και μπορεί να λυθεί με την προσθήκη μοναδικών στηλών ευρετηρίου. 2. Αυτός ο τύπος διπλότυπου προβλήματος απαιτεί συνήθως τη διατήρηση της πρώτης εγγραφής στη διπλότυπη εγγραφή και η μέθοδος λειτουργίας είναι η εξής Ας υποθέσουμε ότι υπάρχουν διπλά πεδία Όνομα και Διεύθυνση, και πρέπει να λάβετε ένα μοναδικό σύνολο αποτελεσμάτων για αυτά τα δύο πεδία επιλέξτε identity(int,1,1) ως autoID, * στο #Tmp από το tableName επιλέξτε min(autoID) ως autoID σε #Tmp2 από #Tmp ομάδα κατά Όνομα,autoID επιλέξτε * από #Tmp όπου βρίσκεται το autoID (επιλέξτε autoID από #tmp2) Η τελευταία επιλογή λαμβάνει το σύνολο αποτελεσμάτων Όνομα και Διεύθυνση που δεν επαναλαμβάνονται (αλλά υπάρχει ένα πρόσθετο πεδίο autoID, το οποίο μπορεί να γραφτεί στον όρο επιλογής κατά την πραγματική εγγραφή) (4) Τα ερωτήματα είναι διπλότυπα Επιλέξτε * από το όνομα πίνακα όπου αναγνωριστικό είναι (επιλέξτε αναγνωριστικό από το όνομα πίνακα Ομαδοποίηση κατά ταυτότητα έχοντας αριθμό(αναγνωριστικό) > 1 ) 3. Βρείτε περιττές διπλότυπες εγγραφές (πολλαπλά πεδία) στον πίνακα Επιλέξτε * από το βιογραφικό σημείωμα Α όπου (a.peopleId,a.seq) in (επιλέξτε peopleId,seq από την ομάδα βιογραφικών κατά peopleId,seq έχοντας count(*) > 1) Το τρέξιμο θα προκαλέσει προβλήματα και η εγγραφή και η αποστολή όπως where(a.peopleId, a.seq) δεν θα λειτουργήσει!!
|