Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

wo kommt das where hin?

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von lengulins, 9 Mai 2012.

  1. lengulins

    lengulins Benutzer

    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?
     
  2. ukulele

    ukulele Datenbank-Guru

    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.
     
    PLSQL_SQL gefällt das.
  3. lengulins

    lengulins Benutzer

    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?
     
  4. ukulele

    ukulele Datenbank-Guru

    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.
     
  5. lengulins

    lengulins Benutzer

    ok, danke!
     
  6. Charly

    Charly Datenbank-Guru

    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
     
    PLSQL_SQL gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden