1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

WHERE(spalte1,spalte2)

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Yeah1000, 5 Oktober 2011.

  1. Yeah1000

    Yeah1000 Neuer Benutzer

    hi leute,
    ich bin neu im forum und kenn mich noch nicht so aus. entschuldigt also bitte falls eine ähnliche frage schonmal gestellt wurde...

    ich hab mich in den letzten tagen mal ein bisschen an postgresql und mssql versucht und bin da auf ein problem gestoßen.

    in postgresql konnte ich mit der abfrage "WHERE(@FilmID, @GenreName) NOT IN (SELECT "FilmID", "GenreName" FROM "Genres");" zwei spalten in einer abfrage gleichzeitig abfragen. sodass also tatsächlich geschaut wird, dass beide einträge so in einer zeile vorhanden sind.

    (die Variablen kommen aus einem kleinen programm, was in c# geschrieben ist)

    mein problem ist jetzt das auch in mssql hinzukriegen...
    hat einer vorschläge?

    Code (postgresql):

    INSERT INTO "Genres"
    ("GenreID","FilmID", "GenreName")
    SELECT @GenreID, @FilmID, @GenreName
    WHERE (@FilmID, @GenreName) NOT IN (SELECT "FilmID", "GenreName" FROM "Genres");
    SELECT "GenreID" FROM "Genres" WHERE "FilmID" = @FilmID AND "GenreName" = @GenreName;
     
  2. Charly

    Charly Datenbank-Guru

    Hallo Yeah1000,

    versuch es mal hiermit:

    Code:
    INSERT INTO genres (GenreID, FilmID, GenreName)
    SELECT @GenreID, @FilmID, @GenreName
    WHERE cast(@FilmID as nvarchar) + @GenreName NOT IN (SELECT cast(FilmID as nvarchar) + GenreName FROM genres)
    
    Was besseres ist mir in der kürze nicht eingefallen:)

    Gruß Charly
     
  3. Yeah1000

    Yeah1000 Neuer Benutzer

    geil, es funktioniert einwandfrei.
    vielen dank für die schnelle antwort!

    5 sterne für dieses forum

    gruß,

    yeah1000
     
  4. ukulele

    ukulele Datenbank-Guru

    Ich würde lieber eine normale Abfrage draus machen, ohne Spalten zu kombinieren. Oder was spricht dagegen?

    Code:
    SELECT    @GenreID,
            @FilmID,
            @GenreName
    WHERE    @FilmID NOT IN (    SELECT    FilmID
                                FROM    Genres
                                WHERE    FilmID = @FilmID
                                AND        GenreName = @GenreName );
    Es gibt natürlich noch andere Möglichkeiten, je nachdem was du erreichen willst. In der Lösung von Charly musst du verstärkt auf NULL-Werte achten. Abgesehen davon ist das irgendwie doppelt-gemoppelt, sry ;)
     
  5. Charly

    Charly Datenbank-Guru

    OK, meine Lösung hat ihre Tücken und ist nicht perfekt

    Aber die Spalten sehen für mich so aus als wenn die keine NULL zulassen (Nur so eine Vermutung)
    Und was wenn FilmID nicht eindeutig ist sondern mit GenreID/GenreName kombiniert wurde?

    Yaeh1000 versucht bestimmt nicht ohne Grund beide Spalten abzufragen.

    Auch sry;)

    Gruß Charly
     
  6. ukulele

    ukulele Datenbank-Guru

    Reicht ja wenn GenreName NULL ist und schon hast du einen kompletten NULL Eintrag. Über so eine Situation mit NOT IN ( SELECT NULL ) hab ich mir neulich schon den Kopf zerbrochen bis ich dann gemerkt habe das da nen NULL drinne steckt :) Ergebniss ist, das keine Einschränkung gilt und alle Datensätze eingetragen werden.

    Die FilmID muss zusammen mit GenreName eindeutig sein, sonst hätte er das selbe Problem auch in seinem Postgres Code. Vermutlich ist sie es auch ohne GenreName...
     
  7. ukulele

    ukulele Datenbank-Guru

    Um das ganze mal zu demonstrieren (und weil ich grad kein Bock auf Arbeit hab):

    Code:
    DECLARE    @GenreID INT,
            @FilmID INT,
            @GenreName VARCHAR(10)
    
    SET        @GenreID = 1
    SET        @FilmID = 2
    SET        @GenreName = 'asdf' -- Variante 1
    SET        @GenreName = NULL  -- Variante 2
    
    SELECT    @GenreID,
            @FilmID,
            @GenreName
    FROM (    SELECT    @GenreID AS GenreID,
                    @FilmID AS FilmID,
                    @GenreName AS GenreName ) AS tabelle
    WHERE    @FilmID NOT IN (    SELECT    FilmID
                                FROM (    SELECT    @GenreID AS GenreID,
                                                @FilmID AS FilmID,
                                                @GenreName AS GenreName ) AS tabelle
                                WHERE    FilmID = @FilmID
                                AND        GenreName = @GenreName )
    Der Datensatz auf den geprüft wird ist immer vorhanden. In Variante 1 ohne NULL Wert, in Variante 2 mit. Nur das die Prüfung im 2ten Fall scheitert und nicht erkannt wird, das der Datensatz in der Tabelle steht. Das trifft auch bei allen anderen Datensätzen plötzlich nicht mehr zu, weil die komplette Werteliste NULL ist.

    Code:
    DECLARE    @GenreID INT,
            @FilmID INT,
            @GenreName VARCHAR(10)
    
    SET        @GenreID = 1
    SET        @FilmID = 2
    SET        @GenreName = 'asdf' -- Variante 1
    SET        @GenreName = NULL  -- Variante 2
    
    SELECT    @GenreID,
            @FilmID,
            @GenreName
    FROM (    SELECT    @GenreID AS GenreID,
                    @FilmID AS FilmID,
                    @GenreName AS GenreName
            UNION ALL
            SELECT    3 AS GenreID,
                    4 AS FilmID,
                    'qwert' AS GenreName ) AS tabelle
    WHERE    @FilmID NOT IN (    SELECT    FilmID
                                FROM (    SELECT    @GenreID AS GenreID,
                                                @FilmID AS FilmID,
                                                @GenreName AS GenreName
                                        UNION ALL
                                        SELECT    3 AS GenreID,
                                                4 AS FilmID,
                                                'qwert' AS GenreName ) AS tabelle
                                WHERE    FilmID = @FilmID
                                AND        GenreName = @GenreName )
    
    -- Werteliste
    SELECT    FilmID
    FROM (    SELECT    @GenreID AS GenreID,
                    @FilmID AS FilmID,
                    @GenreName AS GenreName
            UNION ALL
            SELECT    3 AS GenreID,
                    4 AS FilmID,
                    'qwert' AS GenreName ) AS tabelle
    WHERE    FilmID = @FilmID
    AND        GenreName = @GenreName
     
    Charly gefällt das.
  8. Charly

    Charly Datenbank-Guru

    Ach so, das mit dem NULL-Wert

    Code:
    INSERT INTO genres (GenreID, FilmID, GenreName)
    SELECT @GenreID, @FilmID, @GenreName
    WHERE cast(@FilmID as nvarchar) + @GenreName NOT IN (select cast(isnull(FilmID,0) as nvarchar) + isnull(GenreName,'') FROM genres)
    
    Besser so?

    Hab gerde auch keinen Bock auf Arbeit.:D

    Gruß Charly
     
  9. ukulele

    ukulele Datenbank-Guru

Diese Seite empfehlen