SQL UPDATE mit UNION Abfrage

Marcel@Heuer

Neuer Benutzer
Beiträge
1
Moin Zusammen,

bei folgendem Befehl komme ich nicht weiter, wie füge ich denn das Ergebnis des Union Select block als Bedingung ein?
es soll für alle Einträge wo es mehr als 1 Ergebnis gibt der Eintrag BSSPERR gesetzt werden.

SQL:
UPDATE BESTKK
Set BESTKK.BSSPERR ='WIT'
Where
(
SELECT BESTKK.BSBESTNR as Bezugnahme_oder_Externerefrenz, COUNT(*) as Anzahl_Belege
FROM BESTKK with(Nolock)
where   BESTKK.BSBELTYP  LIKE 'B%'
and BESTKK.BSMANKEY = 2
AND BESTKK.BSBEAKZ IN(200,502,503,504,506,507,508,509)
and BESTKK.BSBESTNR!=''
and BESTKK.bshinweis not like '%dubletten geprüft%'
and BESTKK.BSDATUM BETWEEN DATEADD(DD, -14, CAST(CONVERT(VARCHAR, GETDATE(), 112) AS DATETIME)) AND DATEADD(DD, +1, CAST(CONVERT(VARCHAR, GETDATE(), 112) AS DATETIME))
Group BY BSBESTNR
HAVING COUNT(*) > 1

OR

Select RECHKK.BSBESTNR as Bezugnahme_oder_Externerefrenz, COUNT(*) as Anzahl_Belege
from RECHKK with(Nolock)
Where
Rechkk.bsbeltyp ='F' AND
RECHKK.bsmankey ='2' AND
RECHKK.BSBESTNR!='' AND
RECHKK.BSBEAKZ IN(200,502,503,504,506,507,508,509) AND
RECHKK.bshinweis not like '%dubletten geprüft%' AND
RECHKK.BSDATUM BETWEEN DATEADD(DD, -14, CAST(CONVERT(VARCHAR, GETDATE(), 112) AS DATETIME)) AND DATEADD(DD, +1, CAST(CONVERT(VARCHAR, GETDATE(), 112) AS DATETIME))
Group BY BSBESTNR
HAVING COUNT(*) > 1

union all

SELECT BESTKK.BSEXTREF1 as Bezugnahme_oder_Externerefrenz, COUNT(*) as Anzahl_Belege
FROM BESTKK with(Nolock)
where   BESTKK.BSBELTYP  LIKE 'B%'
and BESTKK.BSMANKEY = 2
and BESTKK.BSEXTREF1!=''
AND BESTKK.BSBEAKZ IN(200,202,502,503,504,506,507,508,509)
AND BESTKK.bshinweis not like '%dubletten geprüft%'
and BESTKK.BSDATUM BETWEEN DATEADD(DD, -14, CAST(CONVERT(VARCHAR, GETDATE(), 112) AS DATETIME)) AND DATEADD(DD, +1, CAST(CONVERT(VARCHAR, GETDATE(), 112) AS DATETIME))
Group BY BSEXTREF1
HAVING COUNT(*) > 1

union all

Select RECHKK.BSEXTREF1 as Bezugnahme_oder_Externerefrenz, COUNT(*) as Anzahl_Belege
from RECHKK with(Nolock)
Where
Rechkk.bsbeltyp ='F' AND
RECHKK.bsmankey ='2' AND
RECHKK.BSEXTREF1!='' AND
RECHKK.BSBEAKZ IN(200,202,502,503,504,506,507,508,509) AND
RECHKK.bshinweis not like '%dubletten geprüft%'AND
RECHKK.BSDATUM BETWEEN DATEADD(DD, -14, CAST(CONVERT(VARCHAR, GETDATE(), 112) AS DATETIME)) AND DATEADD(DD, +1, CAST(CONVERT(VARCHAR, GETDATE(), 112) AS DATETIME))
Group BY BSEXTREF1
HAVING COUNT(*) > 1
Order BY Anzahl_Belege desc
)
 
Werbung:
Hallo
mir fallen an deinem Statement mehrere Sachen auf

A) In der Abfrage ist nicht klar welche Daten geändert werden müssen (es fehlt die Spalte für den Vergleich). Wenn du aber bei deinen Selects unterschiedliche Spalten hernimmst wirst du vermutlich auch bei der Vergleichspalte unterschiedliche brauchen.
B) Union ALL bewirkt das idente Einträge die aus den unterschiedlichen Ergebnissen kommen doppelt aufgeführt werden. Vielleicht ist das Aufgrund der where Kriterien eh nicht möglich aber ich würde hier nur ein UNION ohne ALL verwenden.
C) Die Spalte Anzahl_Belege in den Unterabfragen wird dir nicht weiterhelfen oder dich gar behindern. Kommt drauf an wie du den Vergleich machst.
 
Zurück
Oben