none
Benötige Hilfe bei einer Abfrage RRS feed

  • Frage

  • Hallo,

    ich mache eine Abfrage aus zwei Tabellen. In Tabelle 1 (cms_player_layout) befinden sich die 'PlayerID' und 'LayoutTypeID', in Tabelle 2 (cms_player) die 'PlayerID' und der 'PlayerName'.

    Tabelle 1 könnte so aussehen:

    PlayerID,LayoutTypeID

    96,1
    96,3
    96,4
    112,3
    113,32
    111,2

    Die Abfrage soll später alle 'PlayerID' und 'PlayerName' anzeigen, welche nicht in der Tabelle 1 sich befinden bzw. welche in Tabelle 1 sind, jedoch nicht mit dem 'LayoutTypeID' übereinstimmen.

    Ich habe dazu folgende Abfrage gemacht:

    ALTER PROCEDURE [dbo].[Test1] 
    	-- Add the parameters for the stored procedure here
    	@IDList nvarchar(MAX),
    	@LayoutTypeID int
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
        -- Insert statements for procedure here
    	SELECT DISTINCT i.LongValue, b.playerName 
    	FROM cms_player_layout as a
    		JOIN LongCommaSplit(@IDList) i on i.LongValue = a.PlayerID and a.LayoutTypeID != @LayoutTypeID
    		or i.LongValue not in (SELECT DISTINCT PlayerID from cms_player_layout)
    		JOIN cms_player as b on i.LongValue=b.playerID
    END
    

    Wenn ich jetzt z. B. folgende Daten abfrage:
    @IDList = N'85,86,91,96,100,112,113,114'
    @LayoutTypeID = 4

    Die Ausgabe funktioniert, jedoch wird auch der Player mit der ID 96 mit ausgegeben - dieser sollte aber ausgeschlossen sein, da er mit in einem Datensatz mit dem 'LayoutTypeID' übereinstimmt.

    Das bekomme ich einfach nicht hin.

    Gruß

    Reiner

    Freitag, 3. Mai 2013 07:46

Antworten

  • hmm, kannst du das etwas klarer formulieren? Es klingt wie:

    SELECT  P.PlayerID ,
            P.PlayerName
    FROM    cms_player P
            LEFT JOIN cms_player_layout PL ON P.Player_ID = PL.PlayerID
                                              AND PL.LayoutTypeID = @LayoutTypeID
    WHERE   PL.PlayerID IS NULL
            AND P.PlayerID IN ( SELECT  LongValue
                                FROM    LongCommaSplit(@IDList) );

    Oder

    SELECT  P.PlayerID ,
            P.PlayerName
    FROM    PlayersFiltered P
            INNER JOIN ( SELECT LongValue
                         FROM   LongCommaSplit(@IDList)
                       ) F ON P.PlayerID = F.LongValue
            LEFT JOIN cms_player_layout PL ON P.Player_ID = PL.PlayerID
                                              AND PL.LayoutTypeID = @LayoutTypeID
    WHERE   PL.PlayerID IS NULL;

    Oder

    WITH    PlayersFiltered
              AS ( SELECT   PlayerID ,
                            PlayerName
                   FROM     cms_player P
                            INNER JOIN ( SELECT LongValue
                                         FROM   LongCommaSplit(@IDList)
                                       ) F ON P.PlayerID = F.LongValue
                 )
        SELECT  P.PlayerID ,
                P.PlayerName
        FROM    PlayersFiltered P
                LEFT JOIN cms_player_layout PL ON P.Player_ID = PL.PlayerID
                                                  AND PL.LayoutTypeID = @LayoutTypeID
        WHERE   PL.PlayerID IS NULL;

    • Als Antwort markiert Rebelhig Sonntag, 5. Mai 2013 09:00
    Freitag, 3. Mai 2013 14:08
    Moderator

Alle Antworten

  • Die Abfrage stimmt grundsätzlich nicht. Ohne Splitfunktion sollte sie so aussehen:

    SELECT  P.PlayerID ,
            P.PlayerName
    FROM    cms_player P
            LEFT JOIN cms_player_layout PL ON P.Player_ID = PL.PlayerID
                                              AND PL.LayoutTypeID = @LayoutTypeID
    WHERE   PL.PlayerID IS NULL;

    Freitag, 3. Mai 2013 08:00
    Moderator
  • Hallo Stefan,

    Danke erst einmal für die schnelle Antwort.

    So erhalte ich allerdings alle Player aus der Tabelle cms_player. Ich wollte jedoch aus der Auswahl, welche der Splitfunktion übergeben werden, das Resultat. In meinem Beispiel wollte ich damit nur die Ausgabe für die PlayerID's 85,86,91,100,112,113,114. 96 sollte ausgeschlossen werden, da hier die LayoutTypeID 4 bei einem Datensatz existiert.

    Ist das überhaupt möglich mit einer Abfrage?

    Gruß

    Reiner

    Freitag, 3. Mai 2013 11:55
  • hmm, kannst du das etwas klarer formulieren? Es klingt wie:

    SELECT  P.PlayerID ,
            P.PlayerName
    FROM    cms_player P
            LEFT JOIN cms_player_layout PL ON P.Player_ID = PL.PlayerID
                                              AND PL.LayoutTypeID = @LayoutTypeID
    WHERE   PL.PlayerID IS NULL
            AND P.PlayerID IN ( SELECT  LongValue
                                FROM    LongCommaSplit(@IDList) );

    Oder

    SELECT  P.PlayerID ,
            P.PlayerName
    FROM    PlayersFiltered P
            INNER JOIN ( SELECT LongValue
                         FROM   LongCommaSplit(@IDList)
                       ) F ON P.PlayerID = F.LongValue
            LEFT JOIN cms_player_layout PL ON P.Player_ID = PL.PlayerID
                                              AND PL.LayoutTypeID = @LayoutTypeID
    WHERE   PL.PlayerID IS NULL;

    Oder

    WITH    PlayersFiltered
              AS ( SELECT   PlayerID ,
                            PlayerName
                   FROM     cms_player P
                            INNER JOIN ( SELECT LongValue
                                         FROM   LongCommaSplit(@IDList)
                                       ) F ON P.PlayerID = F.LongValue
                 )
        SELECT  P.PlayerID ,
                P.PlayerName
        FROM    PlayersFiltered P
                LEFT JOIN cms_player_layout PL ON P.Player_ID = PL.PlayerID
                                                  AND PL.LayoutTypeID = @LayoutTypeID
        WHERE   PL.PlayerID IS NULL;

    • Als Antwort markiert Rebelhig Sonntag, 5. Mai 2013 09:00
    Freitag, 3. Mai 2013 14:08
    Moderator
  • Besten Dank. So hat es funktioniert.

    Reiner

    Sonntag, 5. Mai 2013 09:00