2016-05-05 5 views
1

Mein SQL ist sehr rostig. Ich versuche, einen Zähler in einer Tabelle mit einem COUNT (*) aus der gleichen Tabelle in Form einer geschachtelten Abfrage zu aktualisieren. Die SQL ist unten:Update MS Access-Tabelle von verschachtelten Abfrage

UPDATE DWInvoiceHeader AS A 
SET A.InvCount = (Select Count(B.HIINV) From DWInvoiceHeader AS B 
        WHERE (B.HIVENT = '0') 
        Group By B.HIINV 
        Order By B.HIINV) 
WHERE (A.HIVENT = '0'); 

Die Zeilen wie folgt aussehen:

HIINV1.......Seq1.....InvCount - want InvCount to be 3 
HIINV1.......Seq2.....InvCount - want InvCount to be 3 
HIINV1.......Seq3.....InvCount - want InvCount to be 3 
HIINV2.......Seq1.....InvCount - want InvCount to be 2 
HIINV2.......Seq2.....Invcount - want InvCount to be 2 
. 
. 
. 
HIINVn.......Seq1.....InvCount - want InvCount to be 1 

Die SQL gibt mir über die Meldung "Operation muss eine aktualisierbare Abfrage sein".

Irgendwelche Ideen?

+0

[Warum ist meine Abfrage schreibgeschützt?] (Http://allenbrowne.com/ser-61.html) – marlan

Antwort

0
UPDATE DWInvoiceHeader AS A 
SET A.InvCount = 
(
    Select Count(B.HIINV) 
     From DWInvoiceHeader AS B 
     WHERE (B.HIVENT = '0') AND (A.HIINV = B.HIINV) 
     Group By B.HIINV 
) 
WHERE (A.HIVENT = '0'); 
+0

@RawleRamkeesoon, War es nicht eine verschachtelte Abfrage, die Sie angefordert haben? dosiere die obige Lösung die gewünschte Ergebnismenge? Hat die obige Lösung einen Fehler verursacht? – marlan

0

Sie könnten die Domain Funktion Dcount in ähnlicher Weise wie verwenden:

UPDATE test 
SET InvCount = Dcount("HIVENT","test","[HIVENT]='0'") 

Wenn Sie einen generischen Ansatz verwenden wollen, dann würde ich vorschlagen, die Zählungen in einem Arbeitstisch zu speichern und dann aktualisieren Ihr Tisch verbindet den Arbeitstisch.

Select B.HIINV,Count(B.HIINV) as InvCount 
    into WorkingTbl 
    From DWInvoiceHeader AS B 
    WHERE (B.HIVENT = '0') AND (A.HIINV = B.HIINV) 
    Group By B.HIINV 

    Update DWInvoiceHeader A 
    Inner Join WorkingTbl b 
    on a.HIINV=b.HIINV 
    Set A.InvCount=b.InvCount 
+0

Versucht diese 2-teilige Lösung mit einem Zwischentisch und es hat gut funktioniert. Der DCOUNT-Funktionscode gab eine "Missing Operator" Nachricht. –

+0

Dcount sollte so sein: Dcount ("HIINV", "DWInvoiceHeader", "(B.HIVENT = '0') UND (A.HIINV = B.HIINV)") – marlan

+0

Aber im Allgemeinen: [Office-Unterstützung auf Dcount-Funktion ] (https://support.office.com/de-de/article/DCount-Function-F6B5D78B-AD0B-4E42-BE7A-11A64ACBF3D3?ui=en-US&rs=en-US&ad=US&fromAR=1) Tipp: The Count Die Funktion wurde optimiert, um das Zählen von Datensätzen in Abfragen zu beschleunigen. ** Verwenden Sie die Funktion * Count * in einem Abfrageausdruck anstelle der Funktion DCount **, und legen Sie optionale Kriterien fest, um Einschränkungen für die Ergebnisse zu erzwingen. ** Verwenden Sie die * DCount * -Funktion, wenn Sie Datensätze in einer Domäne aus einem Codemodul ** oder Makro oder in einem berechneten Steuerelement zählen müssen. – marlan