Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: ironpete am November 17, 2015, 17:38:41

Titel: DELETE FROM tbl_A WHERE IN (tbl_B)
Beitrag von: ironpete am November 17, 2015, 17:38:41
Servus, ich sehe den Fehler nicht...

Ich möchte alle DS aus tbl_A löschen, die bereits in tbl_B enthalten sind. Access sagt bitte mich freundlich "Geben Sie die Tabelle an, die die zu löschenden Datensätze enthält."
In der Datenblattansicht werden mir die 6 rausgefischten DS angezeigt, beim Ausführen kommt die Fehlermeldung.

Was mache ich falsch?


code
DELETE A.LegalUnit, A.PDIV, A.Broken_Promise_Type, A.Channel, A.FV, A.OrderNo, A.OrderLineNo, A.Broken_Promise_Date, A.P_ID
FROM tbl_ICSS_Potential AS A LEFT JOIN B ON (A.OrderNo = B.[Supply Ord]) AND (A.OrderLineNo = B.LineNo)
WHERE (((A.OrderNo) In (B.[Supply Ord])));
Titel: Re: DELETE FROM tbl_A WHERE IN (tbl_B)
Beitrag von: DF6GL am November 17, 2015, 17:59:33
Hallo,

gibt es diese Tabelle:

LEFT JOIN B ON

??

Warum left Join und nicht inner Join?

Zudem ist die Selectliste überflüssig, bzw. ein Sternchen reicht.

Titel: Re: DELETE FROM tbl_A WHERE IN (tbl_B)
Beitrag von: ebs17 am November 17, 2015, 18:18:34
WHERE A.OrderNo In (B.[Supply Ord])
Dieses Konstrukt dürfte auch unbrauchbar sein.
IN benötigt eine kommagetrennte Werteliste oder aber eine vollständige Unterabfrage.


DELETE
FROM
   tbl_ICSS_Potential AS A
WHERE
   EXISTS
      (
         SELECT
            NULL
         FROM
            B
         WHERE
            A.OrderNo = B.[Supply Ord]
               AND
            A.OrderLineNo = B.LineNo
      )

Wenn man in der Hauptabfrage nur eine Tabelle führt, kann es keine Unklarheiten geben, wo gelöscht wird. Da sowieso nur ganze Datensätze gelöscht werden, kann die Angabe von Feldbezeichnungen ganz entfallen.
Titel: Re: DELETE FROM tbl_A WHERE IN (tbl_B)
Beitrag von: ironpete am November 18, 2015, 13:44:02
Servus,

ein Traum! Danke, funzt!

Was macht das Select NULL?

Titel: Re: DELETE FROM tbl_A WHERE IN (tbl_B)
Beitrag von: ebs17 am November 18, 2015, 17:11:51
EXISTS prüft nur auf True bzw. False, sprich gibt es Datensätze in der Unterabfrage oder nicht. Was da im SELECT-Teil steht ist dafür uninteressant.
Damit nun nicht Feldinhalte geladen werden (was nur Aufwand und Zeitkosten bedeutet), kann man eine Konstante verwenden. Ich wähle da NULL wegen der Nullbedeutung, Du kannst aber auch was anderes nehmen wie z.B. "susi".