2016-11-14 1 views
1

これは私の初めてのUNIONであり、これを修正して正しい出力を表示する方法がわかりません。現在、9つの出力が表示されていますが、1つのクエリから最大値を取得し、devName 'Blizzard Entertainment'のみの別のwhere句を使用したいと考えています(Randy TroyとgsExperiencePoints)。 Thomas HardyはBlizzardのゲームをプレイしないので正解ではありません。私は自分のデータベースの中で最もExpを持っているので追加されます。Unionを正しく使用する方法

現在、これは私の出力です:

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

ここでのアドバイス:SQLステートメントにジョインした場合、**常に**エイリアスですべてのフィールドを修飾します。どこにでも。私は、列がどのテーブルから選択されているかを知ることなく、これらのようなクエリを実際に見たいとは思わない。質問:集計関数(SUMなど)を持たないフィールドでGROUP BYを使用する理由別の値を選択することを意味しましたか?その場合は、 'GROUP BY'を使わずに' SELECT DISTINCT ... 'を実行します。 –

+0

あなたは、実際に組合を必要としないか、必要としないように思えます。最高の経験値を持つ「Blizzard Entertainment」を選択しようとしていますか? – kicken

+0

@kicken「Blizzard Entertainment」のゲームをプレイした人が最高の経験を持ち、彼(ランディトロイ) – Bowie

答えて

1

最初のものは、リスト全体の選択を行います。

UNIONは、最初のUNIONに2番目のUNIONを追加します。

おそらく、UNIONではなくINTERSECT操作が必要です。これは、第1の選択の記録が第2の選択の基準を有することを必要とする。 UNION演算子は、2番目の操作のレコードを最初の操作のレコードに追加するだけです。

これらの操作については、https://technet.microsoft.com/en-us/library/ms191523(v=sql.105).aspxに記載されています。

+0

私はINTERSECTで簡単に試してみましたが、今度は何の示唆もありませんでした。 – Bowie

+0

おそらく、最初のwhere句に2番目の選択肢のwhere句を追加し、UNIONと2番目の句をまとめて取り除いてみるべきでしょう。 WHERE節はWHERE gsExperiencePoints =(SELECT MAX(gsExperiencePoints)FROM GAME_STAT)とdevName = 'Blizzard Entertainment'になります。 –

+0

私はそれを試みましたが、質問を2つと考えて一緒に置くように言われたことは何もありません。 – Bowie

0

が、これはそれをしないかどうかを確認してください:

すなわち
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' 
    ); 

は:ブリザードエンターテインメントによって作られたゲームの最大の経験値に等しい経験値を持っているすべてのゲーマーを選択します。


PS:テーブル名や列名、または他のデータベースオブジェクトの場合は、すべて大文字ではありません。

+0

Heh、私は何回か私の答えを編集しました、私はあなたが欲しいものを持っていると思います。将来的に疑問がある場合は、テーブルレイアウトとサンプルデータを含める方がよいので、それを簡単に取り巻くことができます。この記事を参照してください:[パブリックフォーラムでのT-SQL質問の投稿方法](http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public -フォーラム/)。 –

0

このクエリは、最高の経験値を持つユーザーにブリザードゲームをプレイする必要があります。

SELECT TOP 1 
    gr.gamerFirst + ' ' + gr.gamerLast as Gamer, 
    maxGs.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 d ON d.devID=g.devID 
INNER JOIN (
    SELECT gs.gamerID, MAX(gs.gsExperiencePoints) as gsExperiencePoints 
    FROM GAME_STAT gs 
    GROUP BY gs.gamerID 
) maxGs ON maxGS.gamerID = gr.gamerID 
WHERE 
    d.devName='Blizzard Entertainment' 
ORDER BY 
    maxGs.gsExperiencePoints DESC 

内側のサブクエリは、最初にすべてのゲームのすべてのゲーマーとその最大の経験値のリストを選択します。これは外部クエリと結合され、「ブリザードエンターテイメント」ゲームを持つゲーマーのリストを選択します。最終的な結果は、各ブリザードプレイヤーとその最大の経験値のリストです。最後に、降順に並べて最初のレコードを取得します。