ottscho
Goto Top

Update - Unterabfrage

Hey,

heute sind dummerweise einige Duplikatdatensätze angelegt bzw. automatisch durch ein fehlerhaften Import eingefügt worden, welche ich wieder los werden möchte.

Ich habe in meiner Tabelle ein Feld AccountNumber, CreatedOn, Delete

Nun sieht es z.B. so aus:


Accountnumber , CreatedOn
10000 , 2010-12-01 18:49:34
10000 , 2011-07-08 14:45:00
10001 , 2010-03-01 18:49:34
10002 , 2010-08-05 04:49:34
10003
10003

Mein Probelm, nicht alle Datensätze sind doppelt. Ich möchte nun alles Datensätze, welche heute angelegt worden sind und welche doppelt sind markieren. bzw. in das Feld "Delete" eine 1 rein schreiben.
Ich wollte erst mal ein select machen, aber da scheitere ich leider schon:

SELECT [AccountNumber] FROM [tw_elektric_MSCRM].[dbo].[AccountBase]
    where (SELECT COUNT(*)  FROM [tw_elektric_MSCRM].[dbo].[AccountBase]
    where [AccountNumber] = [AccountNumber]
    group by  [AccountNumber]) >1

Oder

SELECT Unterabfrage.*
FROM [
SELECT COUNT(*) As Anzahl,[AccountNumber],max(CreatedOn)
   FROM [tw_elektric_MSCRM].[dbo].[AccountBase]
   group by  [AccountNumber]
   ) As Unterabfrage
WHERE Unterabfrage.Anzahl > 1


Ich hoffe ihr habt eine Idee.

Danke

Content-ID: 169410

Url: https://administrator.de/contentid/169410

Ausgedruckt am: 22.11.2024 um 09:11 Uhr

Indrador
Indrador 08.07.2011 um 15:49:25 Uhr
Goto Top
Hi,

das hier gibt genau das aus, was du suchst:

select distinct		account,
					(	
						select COUNT(t1.account) from Testdb..account_test t1 
						where t1.account = t.account 
					)
from Testdb..account_test t

where	account in	(	
						select t2.account from Testdb..account_test t2
						group by t2.account
						having COUNT(t2.account) > 1 
					)

Gruß
ottscho
ottscho 08.07.2011 um 15:59:10 Uhr
Goto Top
Hey,
danke dir, dass sieht schon mal gut aus.
Jetzt bekomme ich eine Liste mir alle Accountnummern welche Doppelt sind.

select distinct	[AccountNumber],
					(	
						select COUNT(t1.[AccountNumber]) from [tw_elektric_MSCRM].[dbo].[AccountBase] t1 
						where t1.[AccountNumber] = t.[AccountNumber] 
					)
from [tw_elektric_MSCRM].[dbo].[AccountBase] t

where	[AccountNumber] in	(	
						select t2.[AccountNumber] from [tw_elektric_MSCRM].[dbo].[AccountBase] t2
						group by t2.[AccountNumber]
						having COUNT(t2.[AccountNumber]) > 1 
					)

Ausgabe:
10000 2
10005 2
10006 2
10009 2
10011 2
10012 2
10015 2
10016 2
10017 2
10023 2

Und jetzt muss in den Datensatz von Beiden markiern, welcher heute erstellt wurde. Sprich CreateOn='2011-07-08'
Indrador
Indrador 08.07.2011 um 16:03:54 Uhr
Goto Top
na das ist doch einfach,

delte from account_test
where account in (
select distinct		account,
					(	
						select COUNT(t1.account) from Testdb..account_test t1 
						where t1.account = t.account 
					)
from Testdb..account_test t

where	account in	(	
						select t2.account from Testdb..account_test t2
						group by t2.account
						having COUNT(t2.account) > 1 
					)
AND
CreateOn='2011-07-08'  

Denk nur dran, du hast in deiner Tabelle Datum+Uhrzeit, wenn du auf ein
Datum vergleichst musst du ggf. je nach DBS die Zeit abschneiden mit cast(Feld as date) o.ä.
sonst findet er keinen Datensatz, weil er genau das Datum + eine exakte Uhrzeit sucht.