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 .
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.
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)
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
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
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.
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
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