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
2 Antworten
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.
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.
Neue Fragen
sql
Structured Query Language (SQL) ist eine Sprache zum Abfragen von Datenbanken. Zu den Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) gehören. Wenn sich Ihre Frage ausschließlich auf ein bestimmtes DBMS bezieht (bestimmte Erweiterungen / Funktionen verwendet), verwenden Sie stattdessen das Tag dieses DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten ISO / IEC-Standard-SQL verwenden.