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

Άποψη: 14609|Απάντηση: 0

[Συμβουλές] SQL Πώς να υποβάλετε ερώτημα σε έναν πίνακα για να καταργήσετε διπλότυπα

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 9/10/2014 11:03:04 π.μ. | | |

Τα ερωτήματα ενός πίνακα/πολλών πινάκων SQL καταργούν διπλότυπες εγγραφές

Διακριτός μονός πίνακας

  1. 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) δεν θα λειτουργήσει!!






Προηγούμενος:Η SQL δημιουργεί αποθηκευμένες διαδικασίες με παραμέτρους
Επόμενος:EPUBReader reader, απαραίτητο για το άνοιγμα αρχείων EPUB
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com