Meine Frage ist, können wir eine Tabelle A mit der resultierenden Tabelle der inneren Verknüpfung von Tabelle A und B verbinden, ohne Unterabfrage-, CTE- oder temporäre Tabellen zu verwenden?

Ich benutze SQL Server.

Ich werde die Situation anhand eines Beispiels erläutern

Dies sind zwei Tabellen GoaLScorers und GoalScoredDetails.

GoaLScorers

gid    Name    
-----------
1       A
2       B
3       A

GoalScoredDetails

DetailId    gid     stadium     goals  Cards
---------------------------------------------
1            1        X          2       1  
2            2        Y          5       2
3            3        Y          2       1

Das erwartete Ergebnis ist, wenn ich ein Stadion 'X' (oder 'Y') auswähle.

Ich sollte den Namen aller Personen erhalten, die dort möglicherweise ein Tor erzielt haben oder nicht, sowie die Gesamtzahl der Tore und die Gesamtzahl der Karten.

Der Nullwert ist für Namen akzeptabel, wenn keine Ziele oder keine Karten vorhanden sind.

Ich kann das erwartete Ergebnis mit der folgenden Abfrage erhalten

SELECT
    gs.name, 
    SUM(goal) as TotalGoals, 
    SUM(cards) as TotalCards
FROM 
    (SELECT
         gid, stadium, goal, cards 
     FROM
         GoalScoredDetails 
     WHERE 
         stadium = 'Y') AS vtable
RIGHT OUTER JOIN 
    GoalScorers AS gs ON vtable.gid = gs.gid 
GROUP BY 
    gs.name

Meine Frage ist, können wir das obige Ergebnis erhalten, ohne eine Unterabfrage oder eine CTE- oder temporäre Tabelle zu verwenden?

Grundsätzlich müssen wir OUTER JOIN GoalScorers zur resultierenden virtuellen Tabelle von INNER JOIN OF GoalScorers und GoalScoredDetails führen.

Ich bin jedoch immer mit einem mehrdeutigen Spaltennamenfehler konfrontiert, da die Spalte "gid" in GoalScorers und auch in der resultierenden Tabelle vorhanden ist. Der Fehler bleibt auch dann bestehen, wenn ich versuche, einen Alias für Spaltennamen zu verwenden.

Ich habe eine SQL-Geige für sie erstellt: http://sqlfiddle.com/#!3/40162 / 8

0
Raj 24 Dez. 2015 im 13:51

2 Antworten

Beste Antwort
SELECT  gs.name, SUM(gsd.goal) AS totalGoals, SUM(gsd.cards) AS totalCards
FROM    GoalScorers gs
LEFT JOIN GoalScoredDetails gsd ON gsd.gid = gs.gid AND
                                   gsd.Stadium = 'Y'
GROUP BY gs.name;

IOW, Sie können Ihre Where-Kriterien auf den Beitritt zum Ausdruck übertragen.

3
Cetin Basoz 24 Dez. 2015 im 11:06

Der Fehler Mehrdeutiger Spaltenname 'Spaltenname' tritt auf, wenn SQL Server auf zwei oder mehr Spalten mit derselben trifft und nicht angegeben wurde, welche verwendet werden soll. Sie können den Fehler vermeiden, indem Sie Ihren Spaltennamen entweder den vollständigen Tabellennamen oder gegebenenfalls einen Alias voranstellen. Verwenden Sie für die folgenden Beispiele die folgenden Daten:

Beispieldaten

DECLARE @GoalScorers TABLE
    (
        gid        INT,
        Name    VARCHAR(1)
    )
;

DECLARE @GoalScoredDetails TABLE
    (
        DetailId    INT,
        gid            INT,
        stadium        VARCHAR(1),
        goals        INT,    
        Cards        INT
    )
;

INSERT INTO @GoalScorers
    (
        gid,
        Name
    )
VALUES
    (1, 'A'),
    (2, 'B'),
    (3, 'A')
;

INSERT INTO @GoalScoredDetails
    (
        DetailId,
        gid,
        stadium,
        goals,
        Cards
    )
VALUES
    (1, 1, 'x', 2, 1),
    (2, 2, 'y', 5, 2),
    (3, 3, 'y', 2, 1)
;

In diesem ersten Beispiel erhalten wir den Fehler. Warum? Da es mehr als eine Spalte namens Gott gibt, kann sie nicht sagen, welche verwendet werden soll.

Beispiel fehlgeschlagen

SELECT 
    gid        
FROM
    @GoalScoredDetails AS gsd
        RIGHT OUTER JOIN @GoalScorers as gs        ON gs.gid = gsd.gid
;

Dieses Beispiel funktioniert, weil wir SQL explizit mitteilen, welche GID zurückgegeben werden soll:

Arbeitsbeispiel

SELECT 
    gs.gid        
FROM
    @GoalScoredDetails AS gsd
        RIGHT OUTER JOIN @GoalScorers as gs        ON gs.gid = gsd.gid
;

Sie können natürlich beide zurückgeben:

Beispiel

SELECT 
    gs.gid,       
    gsd.gid
FROM
    @GoalScoredDetails AS gsd
        RIGHT OUTER JOIN @GoalScorers as gs        ON gs.gid = gsd.gid
;

Bei Abfragen mit mehreren Tabellen würde ich immer empfehlen, jedem Spaltennamen einen Tabellen- / Aliasnamen voranzustellen. Dies erleichtert das Verfolgen der Abfrage und verringert die Wahrscheinlichkeit eines solchen Fehlers.

0
David Rushton 24 Dez. 2015 im 11:14