it-swarm.com.de

Wählen Sie Anweisung aus, um Duplikate in bestimmten Feldern zu finden

Können Sie mir mit SQL-Anweisungen dabei helfen, Duplikate in mehreren Feldern zu finden?

Zum Beispiel in Pseudo-Code:

select count(field1,field2,field3) 
from table 
where the combination of field1, field2, field3 occurs multiple times

und aus der obigen Anweisung wenn es mehrere Vorkommen gibt möchte ich jeden Datensatz außer dem ersten auswählen .

405
JOE SKEET

Um die Liste der Felder zu erhalten, für die mehrere Datensätze vorhanden sind, können Sie ..

select field1,field2,field3, count(*)
  from table_name
  group by field1,field2,field3
  having count(*) > 1

Überprüfen Sie diesen Link, um weitere Informationen zum Löschen der Zeilen zu erhalten.

http://support.Microsoft.com/kb/139444

Bearbeiten: Wie von den anderen Benutzern erwähnt, sollte es ein Kriterium dafür geben, wie Sie "erste Zeilen" definieren, bevor Sie den Ansatz im obigen Link verwenden. Auf dieser Grundlage müssen Sie bei Bedarf eine order by-Klausel und eine Unterabfrage verwenden. Wenn Sie einige Beispieldaten veröffentlichen können, wäre das wirklich hilfreich.

824

Sie erwähnen "den ersten", also gehe ich davon aus, dass Sie eine Art Bestellung für Ihre Daten haben. Nehmen wir an, Ihre Daten werden nach einem Feld ID geordnet.

Diese SQL sollte die doppelten Einträge mit Ausnahme der ersten erhalten. Es wählt grundsätzlich alle Zeilen aus, für die eine andere Zeile mit (a) den gleichen Feldern und (b) einer niedrigeren ID vorhanden ist. Die Leistung wird nicht großartig sein, aber es könnte Ihr Problem lösen.

SELECT A.ID, A.field1, A.field2, A.field3
  FROM myTable A
 WHERE EXISTS (SELECT B.ID
                 FROM myTable B
                WHERE B.field1 = A.field1
                  AND B.field2 = A.field2
                  AND B.field3 = A.field3
                  AND B.ID < A.ID)
42
Heinzi

Dies ist eine unterhaltsame Lösung mit SQL Server 2005, die mir gefällt. Ich gehe davon aus, dass mit "für jeden Datensatz außer für den ersten" Sie bedeuten, dass es eine weitere "id" -Spalte gibt, mit der wir feststellen können, welche Zeile "erste" ist.

SELECT id
    , field1
    , field2
    , field3
FROM
(
    SELECT id
        , field1
        , field2
        , field3
        , RANK() OVER (PARTITION BY field1, field2, field3 ORDER BY id ASC) AS [rank]
    FROM table_name
) a
WHERE [rank] > 1
17
Nick Vaccaro

Doppelten Wert anzeigen

with MYCTE  as (
               select row_number() over ( partition by name  order by name) rown,   * from tmptest  

                ) 
              select * from MYCTE where rown <=1
5
manoj Verma

Wenn Sie SQL Server 2005 oder höher verwenden (und die Tags für Ihre Frage zeigen SQL Server 2008 an), können Sie die Ranglistenfunktionen verwenden, um die doppelten Datensätze nach dem ersten zurückzugeben, wenn die Verwendung von Joins aus irgendeinem Grund weniger wünschenswert oder unpraktisch ist. Das folgende Beispiel zeigt dies in Aktion, wo es auch mit Nullwerten in den untersuchten Spalten arbeitet.

create table Table1 (
 Field1 int,
 Field2 int,
 Field3 int,
 Field4 int 
)

insert  Table1 
values    (1,1,1,1)
        , (1,1,1,2)
        , (1,1,1,3)
        , (2,2,2,1)
        , (3,3,3,1)
        , (3,3,3,2)
        , (null, null, 2, 1)
        , (null, null, 2, 3)

select    *
from     (select      Field1
                    , Field2
                    , Field3
                    , Field4
                    , row_number() over (partition by   Field1
                                                      , Field2
                                                      , Field3
                                         order by       Field4) as occurrence
          from      Table1) x
where     occurrence > 1

Beachten Sie nach dem Ausführen dieses Beispiels, dass der erste Datensatz aus jeder "Gruppe" ausgeschlossen wird und dass Datensätze mit Nullwerten ordnungsgemäß verarbeitet werden.

Wenn Sie keine Spalte zum Sortieren der Datensätze innerhalb einer Gruppe zur Verfügung haben, können Sie die partition-by-Spalten als order-by-Spalten verwenden.

3
CREATE TABLE #tmp
(
    sizeId Varchar(MAX)
)

INSERT  #tmp 
    VALUES ('44'),
        ('44,45,46'),
        ('44,45,46'),
        ('44,45,46'),
        ('44,45,46'),
        ('44,45,46'),
        ('44,45,46')


SELECT * FROM #tmp
DECLARE @SqlStr VARCHAR(MAX)

SELECT @SqlStr = STUFF((SELECT ',' + sizeId
              FROM #tmp
              ORDER BY sizeId
              FOR XML PATH('')), 1, 1, '') 


SELECT TOP 1 * FROM (
select items, count(*)AS Occurrence
  FROM dbo.Split(@SqlStr,',')
  group by items
  having count(*) > 1
  )K
  ORDER BY K.Occurrence DESC    
1
Mr.X

versuchen Sie diese Abfrage, um die Anzahl der einzelnen SELECT-Anweisungen separat zu ermitteln:

select field1,count(field1) as field1Count,field2,count(field2) as field2Counts,field3, count(field3) as field3Counts
from table_name
group by field1,field2,field3
having count(*) > 1
0
daryosh setorg