2016-11-14 5 views
1

Dies ist mein erstes Mal mit UNION und ich bin mir nicht sicher, wie Sie das beheben, um die richtige Ausgabe anzuzeigen, die ich möchte. Momentan zeigt es mir 9 Ausgänge, aber ich möchte, dass es mir nur 1 zeigt (Randy Troy und seine gsExperiencePoints) Ich möchte, dass es das Maximum aus einer Abfrage erhält und eine Where-Klausel von einem anderen nur für devName 'Blizzard Entertainment' verwendet. Thomas Hardy ist nicht die richtige Antwort, da er keine Blizzard-Spiele spielt, deshalb wird er hinzugefügt, weil er in jedem Spiel in meiner Datenbank die meisten Exp hat.So verwenden Sie Union richtig

Derzeit ist meine Ausgabe:

SELECT 
    gamerFirst + ' ' + gamerLast as 'Gamer', 
    gsExperiencePoints 
FROM GAMER as gr 
    INNER JOIN GAME_STAT as gs ON gr.gamerID = gs.gamerID 
     INNER JOIN GAME as g ON gs.gameID = g.gameID 
      INNER JOIN DEVELOPER as d ON g.devID = d.devID 
WHERE gsExperiencePoints = (SELECT MAX(gsExperiencePoints) FROM GAME_STAT) 
GROUP BY gsExperiencePoints, gamerFirst, gamerLast 
UNION ALL 
SELECT 
    gamerFirst + ' ' + gamerLast as 'Gamer', 
    gsExperiencePoints 
FROM GAMER as gr 
    INNER JOIN GAME_STAT as gs ON gr.gamerID = gs.gamerID 
     INNER JOIN GAME as g ON gs.gameID = g.gameID 
      INNER JOIN DEVELOPER as d ON g.devID = d.devID 
WHERE devName = 'Blizzard Entertainment' 
GROUP BY gsExperiencePoints, gamerFirst, gamerLast; 
+0

Einige Ratschläge hier: Wenn Sie Ihre SQL-Anweisung verknüpfen, ** ** immer ** alle Felder mit dem Alias ​​qualifizieren. Überall. Ich möchte solche Abfragen nicht wirklich betrachten, ohne zu wissen, aus welcher Tabelle die Spalten ausgewählt sind. Frage: Warum verwenden GROUP BY für Felder ohne eine Aggregatfunktion (wie zB SUM)? Wolltest du bestimmte Werte auswählen? In diesem Fall, SELECT DISTINCT ... 'ohne die' GROUP BY'. –

+0

Es klingt, als ob Sie nicht wirklich eine Gewerkschaft brauchen oder wollen. Versuchen Sie auszuwählen, welcher 'Blizzard Entertainment' Entwickler die höchsten Erfahrungspunkte hat? – kicken

+0

@kicken Ich versuche herauszufinden, welche Person, die 'Blizzard Entertainment' Spiele gespielt hat, die höchste Erfahrung hat und zeige ihm einfach (Randy Troy) – Bowie

Antwort

1

Die erste hat die Auswahl der gesamten Liste.

Die UNION fügt die zweite zur ersten hinzu.

Sie möchten wahrscheinlich die INTERSECT-Operation anstelle von UNION. Dies würde erfordern, dass die Datensätze in der ersten Auswahl ein Kriterium von der zweiten Auswahl haben. Der UNION-Operator hängt die Datensätze aus der zweiten Operation einfach an die Datensätze der ersten Operation an.

Diese Vorgänge sind unter https://technet.microsoft.com/en-us/library/ms191523(v=sql.105).aspx dokumentiert.

+0

Ich spielte kurz mit INTERSECT und es gab mir diesmal gar nichts, irgendwelche anderen Hinweise? – Bowie

+0

Vielleicht sollten Sie versuchen, die where-Klausel aus der zweiten Auswahl der where-Klausel von der ersten hinzuzufügen und die UNION und die zweite Klausel alle zusammen loszuwerden. Die WHERE-Klausel wäre dann WHERE gsExperiencePoints = (MAX SELECT (gsExperiencePoints) FROM GAME_STAT) UND devName = 'Blizzard Entertainment' –

+0

Ich habe das versucht, aber es gibt mir auch nichts, was mir gesagt wurde, die Frage als zwei zu betrachten und sie zusammenzufügen. – Bowie

0

Sehen Sie, wenn dies tut es:

SELECT 
    gr.gamerFirst + ' ' + gr.gamerLast as Gamer, 
    gs.gsExperiencePoints 
FROM 
    gamer AS gr 
    INNER JOIN game_stat AS gs ON 
     gs.gamerid=g.gamerid 
WHERE 
    gs.gsexperiencepoints=(
     SELECT 
      MAX(gs.gsexperiencepoints) 
     FROM 
      game_stat AS gs 
      INNER JOIN game AS g ON 
       g.gameid=gs.gameid 
      INNER JOIN developer AS dev ON 
       dev.devid=g.devid 
     WHERE 
      dev.devname='Blizzard Entertainment' 
    ); 

In Worten: alle Spieler auswählen, die für Spiele gemacht von Blizzard Entertainment Erfahrungspunkte gleich den maximalen Erfahrungspunkte.


PS: Ich mag keine Großbuchstaben für Tabellen- oder Spaltennamen oder irgendein anderes Datenbankobjekt für diese Angelegenheit.

+0

Heh, ich habe meine Antwort mehrmals bearbeitet, ich glaube ich habe was du willst. Wenn Sie in Zukunft Fragen haben, ist es besser, ein Tabellenlayout und Beispieldaten zu verwenden, damit es einfacher ist, damit herumzuspielen. Siehe diesen Artikel: [Wie man eine T-SQL-Frage in einem öffentlichen Forum veröffentlicht] (http://spaghettiba.com/2015/04/24/how-to-post-at-sql-question-on-a-public -Forum/). –

0

Diese Abfrage sollte dem Benutzer, der die höchsten Erfahrungspunkte hat und ein Blizzard-Spiel gespielt hat, geben.

Die innere Unterabfrage wählt zuerst eine Liste aller Spieler und ihre maximalen Erfahrungspunkte über alle Spiele aus. Dies wird dann mit der äußeren Abfrage verbunden, die eine Liste von Spielern auswählt, die ein "Blizzard Entertainment" -Spiel haben. Das Endergebnis ist eine Liste aller Blizzard-Spieler mit ihren maximalen Erfahrungspunkten. Zuletzt werden sie in absteigender Reihenfolge angeordnet und die erste Aufzeichnung wird gemacht.