wo kommt das where hin?

lengulins

Benutzer
Beiträge
10
Hallo,
ich habe folgendes 'vereinfachtes' Script. ('1441EC1C-CC99-E111-31B2-00505699001F' ist normalerweise eine Variable)

Code:
INSERT INTO Ud_SVAssetChangeConnectionClassBase
        ([Ud_SVAssetChangeIST]
        ,[Ud_SVAssetChangeSOLL]
        ,[Ud_SVInventoryNumber]
        ,[UsedInTypeUd_SVAssetChangeType])
        SELECT
            1,
            0,
            acb.InventoryNumber,
            '1441EC1C-CC99-E111-31B2-00505699001F'
        FROM SPSAssetClassBase acb
       
        INNER JOIN
        Ud_SVAssetChangeClassBase CHG ON acb.Workplace =CHG.UD_Workplace
            where CHG.UsedInTypeUd_SVAssetChangeType like '1441EC1C-CC99-E111-31B2-00505699001F'

Diese Datensätze möchte ich gern einfügen, wenn es die Inventarnummer [Ud_SVInventoryNumber]unter der Rubik [UsedInTypeUd_SVAssetChangeType] noch nicht gibt.
Also in der Art
Code:
where (
        acb.InventoryNumber NOT IN
        (SELECT
        ACCB.Ud_SVInventoryNumber
        FROM Ud_SVAssetChangeConnectionClassBase as ACCB)and
        '1441EC1C-CC99-E111-31B2-00505699001F' NOT IN
        (SELECT
        ACCB.UsedInTypeUd_SVAssetChangeType
        FROM Ud_SVAssetChangeConnectionClassBase as ACCB))
An welcher Stelle verträgt meine Insertanweisung diesen Wherefilter. Kann man den Code für die Where-Anweisung vereinfachen?
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.582
Eigentlich werden mehrere WHERE Bedingungen mit AND oder OR verknüpft. Du kannst also mit

Code:
WHERE CHG.UsedInTypeUd_SVAssetChangeType like '1441EC1C-CC99-E111-31B2-00505699001F'
 
AND acb.InventoryNumber NOT IN (
 
SELECT ACCB.Ud_SVInventoryNumber FROM Ud_SVAssetChangeConnectionClassBase )

eine weitere Bedingung anhängen.
Code:
AND '1441EC1C-CC99-E111-31B2-00505699001F' NOT IN
(SELECT ACCB.UsedInTypeUd_SVAssetChangeType FROM Ud_SVAssetChangeConnectionClassBase)
macht hingegen gar keinen Sinn, weil du für jede Zeile prüfen würdest, ob eine Variable (die sowieso immer gleich ist) in einem einer Tabelle vorkommt.
 

lengulins

Benutzer
Beiträge
10
sorry, hatte zum Test hier einen statischen wert angegeben. In wirklichkeit handelt es sich an dieser Stelle um eine Variable, die der Funktion von ausserhalb übergeben wird (ich habe es auch ganz oben im Text hingeschrieben).
D.h. ich sollte alle 3 Bedingungen in eine where-Klausel verknüpfen, auch wenn sie sich auf unterschiedliche Tabellen beziehen?
 

ukulele

Datenbank-Guru
Beiträge
4.582
Ja, du arbeitest ja mit Subselects als Teil der Bedingung, die eigentliche Prüfung findet ja für ein bestimmtes Feld der eigentlich abgefragten Tabelle statt.
 
Werbung:

Charly

Datenbank-Guru
Beiträge
306
Hallo lengulins,

dann häng das WHERE xyz NOT IN (Unterabfrage) einfach mit AND an die vorhandene WHERE dran.
Das filtert die einzufügenden Zellen. Wenn dann keine mehr übrig bleiben wird einfach nichts eingefügt.

Das Einsetzen von sehr kurzen Bezeichnern erleichtert die Fehlersuche in der Syntax da das Skript dann übersichtlicher wird
Code:
INSERT INTO T1 ([A],[B],[C],[D])
 
SELECT 1,0,'C','D'
 
FROM T2 INNER JOIN T3 ON T2.WP = T3.WP           
 
WHERE T2.D LIKE '<Variable>'
 
AND T2.InventoryNumber NOT IN (SELECT T1.InventoryNumber....)

Sollte laufen.

Gruß Charly
 
Oben