Update auf Tabelle || Einbau von Distinct

Babsi

SQL-Guru
Beiträge
122
Update auf Tabelle || Einbau von Distinct

Hallo zusammen,

ich migriere Accesabfragen auf den SQL Server, habe schon jede menge angepast und umgebaut.

Hier scheitere ich gerade und finde nichts im Netz oder suche falsch.

Die Statements

Aus Access:

UPDATE DISTINCTROW [zzHilfstabelle->Rechnung]
INNER JOIN COMPANY ON [zzHilfstabelle->Rechnung].COMPANY_ID = COMPANY.COMPANY_ID
SET [zzHilfstabelle->Rechnung].OK = 1, [zzHilfstabelle->Rechnung].WhyNot = Trim([WhyNot] & " Büroware-Nr.")
WHERE (((COMPANY.COMPANY_BW)<10000 Or (COMPANY.COMPANY_BW)>90000 Or (COMPANY.COMPANY_BW) Is Null));

Umbau SQL Server:

UPDATE [zzHilfstabelle->Rechnung]
SET OK = 1, [zzHilfstabelle->Rechnung].WhyNot = Trim([WhyNot] & ' Büroware-Nr.')
FROM DISTINCT [zzHilfstabelle->Rechnung] INNER JOIN COMPANY
ON [zzHilfstabelle->Rechnung].COMPANY_ID = COMPANY.COMPANY_ID
WHERE dbo.COMPANY.COMPANY_BW<10000
Or dbo.COMPANY.COMPANY_BW >90000
Or dbo.COMPANY.COMPANY_BW Is Null;
Das Distinct will er an dieser Stelle natürlich nicht, wie kann ich das da mit einbauen?

UPDATE DISTINCT [zzHilfstabelle->Rechnung]
SET OK = 1, [zzHilfstabelle->Rechnung].......
klappt auch nicht
 
Werbung:
Hallo, ich habe es nun wie folgt:

UPDATE [zzHilfstabelle->Rechnung]
SET OK = 1, [zzHilfstabelle->Rechnung].WhyNot = Trim([WhyNot] + ' Büroware-Nr.')
WHERE ID in
(SELECT DISTINCT ID
FROM [zzHilfstabelle->Rechnung] INNER JOIN dbo.COMPANY
ON [zzHilfstabelle->Rechnung].COMPANY_ID = COMPANY.COMPANY_ID
WHERE dbo.COMPANY.COMPANY_BW<10000
Or dbo.COMPANY.COMPANY_BW >90000
Or dbo.COMPANY.COMPANY_BW Is Null)

Wenn ich nur:

SELECT DISTINCT ID
FROM [zzHilfstabelle->Rechnung] INNER JOIN dbo.COMPANY
ON [zzHilfstabelle->Rechnung].COMPANY_ID = COMPANY.COMPANY_ID
WHERE dbo.COMPANY.COMPANY_BW<10000
Or dbo.COMPANY.COMPANY_BW >90000
Or dbo.COMPANY.COMPANY_BW Is Null

ausführe bekomme ich 11 DS, so woll es sein

Das obere Update sagt mit aber
(53 rows affected)

:-(
 
Ich denke ich muss hier erst in eine temporäre Tab schreiben?
Und dann die Daten der eigentlichen Tabelle mit der temp joinen und updaten?

Vielleicht hat noch jemand eine andere Idee.

Gruß, Babsi
 
Natürlich, man kann es immer komplizierter machen als nötig.
Hallo,

das will ich ja gar nicht, bloss nicht.
Aber das Result ist so unterscheidlich.
Einmal 11 Datensätze und einmal 53 Datensätze.

Ich verstehe nicht warum das kein Wiederspruch sein soll, wie meinst Du das?
Ob nun 11 oder 53 aktualisiert werden ist doch ein Unerschied..
Was verstehe ich denn hier nicht?
Gruß, Babsi
 
Aber das Result ist so unterscheidlich.
Einmal 11 Datensätze und einmal 53 Datensätze.

Ich verstehe nicht warum das kein Wiederspruch sein soll, wie meinst Du das?
ich kenne Deine Daten nicht ...

Code:
postgres=# select distinct i from t1 where i = 1;
 i 
---
 1
(1 row)

das gibt 1 Zeile, wenn ich das als Subselect in einem Update nehme aber mehr:

Code:
postgres=# update t2 set val = 'demo' where id in (select distinct id from t1 where id = 1);
UPDATE 3
postgres=#

Komisch?
 
Morgen @Babsi , 1. schau Dir mal den Execution Plan deines Updates an. 2. was kommt bei der Abfrage raus? Is ja die gleiche nur ohne Update
Code:
select *
from [zzHilfstabelle->Rechnung]
WHERE ID in
(SELECT DISTINCT ID
FROM [zzHilfstabelle->Rechnung] INNER JOIN dbo.COMPANY
ON [zzHilfstabelle->Rechnung].COMPANY_ID = COMPANY.COMPANY_ID
WHERE dbo.COMPANY.COMPANY_BW<10000
Or dbo.COMPANY.COMPANY_BW >90000
Or dbo.COMPANY.COMPANY_BW Is Null)
 
Werbung:
Vermutlich gehört das "Distinct" nicht in das gesamte Statement, sondern "hinter" den Join mit Company.
Wenn die Update Tabelle tatsächlich eine Hilfstabelle ist (aka "Nachschlagetabelle") dann wird das Modell vermutlich so aussehen, dass ein Hilfstabelleneintrag für viele Company Einträge gilt.

ich kenne Deine Daten nicht ...
Kann mich da nur anschließen. Es geht also weiter mit Vermutungen.

Wenn ich nur:

SELECT DISTINCT ID
FROM [zzHilfstabelle->Rechnung] INNER JOIN dbo.COMPANY ...
Solche Statements sind auch nicht erhellend. Wenn Du Dir allein die Mühe machen würdest, einen Alias vor ID zu setzen - eine gute Sache für jedes SQL Statement-, dann wüsste man wenigstens sofort, aus welcher Tabelle das stammt.

Vorschlag:
1. Nimm Dein "richtiges" Select Statement, das nur 11 ID zurückgibt (die vermutlich die PK ID der Hilfstabelle sind) und joine das gesamte Statement in Dein Update. Das Update dann ohne Distinct.
2. statt 11 mit 53 zu vergleichen und festzustellen, dass es ungleich ist, kannst Du dir die Inhalte anschauen.
Dann stellst Du vielleicht fest, dass 11 Datensätze vollkommen identisch zu allen 53 Datensätzen sind. Die enthalten also einige Dubletten.
53 Companies erfüllen Deine Where Bedingung.
Diese 53 Datensätze verwenden 11 unterschiedliche Einträge aus der Hilfstabelle.

(alles geraten)
 
Zurück
Oben