如何正确使用Union

时间:2016-11-14 14:57:53

标签: sql-server union

这是我第一次使用UNION,我不知道如何修复它以显示我想要的正确输出。目前它向我展示了9个输出,但我希望它只显示1个(Randy Troy和他的gsExperiencePoints)我希望它从一个查询获得最大值并使用另一个的where子句仅用于devName' Blizzard娱乐&#39 ;. Thomas Hardy并不是正确的答案,因为他没有玩暴雪游戏所以他被添加是因为他在我的数据库中的任何游戏中拥有最多的Exp。

目前这是我的输出:

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;

3 个答案:

答案 0 :(得分:1)

第一个选择整个列表。

UNION将第二个添加到第一个。

您可能需要INTERSECT操作而不是UNION。这将要求第一次选择中的记录具有来自第二次选择的一些标准。 UNION运算符只是将第二个操作的记录附加到第一个操作的记录中。

这些操作记录在https://technet.microsoft.com/en-us/library/ms191523(v=sql.105).aspx

答案 1 :(得分: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:我不喜欢表名或列名的全部大写,或任何其他数据库对象。

答案 2 :(得分: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

内部子查询首先选择所有游戏玩家的列表及其在所有游戏中的最大经验值。然后将其与外部查询联系起来,该外部查询选择具有“暴雪娱乐”游戏的游戏玩家列表。最终结果是每个暴雪玩家的列表以及他们的最大经验值。最后,它只是按降序排列并取得第一条记录。