WHERE(spalte1,spalte2)

Yeah1000

Neuer Benutzer
Beiträge
2
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;
 
Werbung:

Charly

Datenbank-Guru
Beiträge
306
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
 

ukulele

Datenbank-Guru
Beiträge
4.702
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 ;)
 

Charly

Datenbank-Guru
Beiträge
306
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
 

ukulele

Datenbank-Guru
Beiträge
4.702
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...
 

ukulele

Datenbank-Guru
Beiträge
4.702
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

Datenbank-Guru
Beiträge
306
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
 
Werbung:
Oben