Sql server 如何正确使用工会

Sql server 如何正确使用工会,sql-server,union,Sql Server,Union,这是我第一次使用UNION,我不知道如何修复它以显示我想要的正确输出。目前,它向我显示了9个输出,但我希望它只显示1个Randy Troy和他的gsExperiencePoints,我希望它从一个查询中获得最大值,并使用另一个查询中的where子句,仅用于devName“暴雪娱乐”。托马斯·哈代不是正确的答案,因为他不玩暴雪游戏,所以他被添加进来,因为他是我数据库中所有游戏中经验最多的 目前这是我的输出: 第一个用于选择整个列表 工会在第一个基础上增加第二个 您可能希望使用INTERSECT操作

这是我第一次使用UNION,我不知道如何修复它以显示我想要的正确输出。目前,它向我显示了9个输出,但我希望它只显示1个Randy Troy和他的gsExperiencePoints,我希望它从一个查询中获得最大值,并使用另一个查询中的where子句,仅用于devName“暴雪娱乐”。托马斯·哈代不是正确的答案,因为他不玩暴雪游戏,所以他被添加进来,因为他是我数据库中所有游戏中经验最多的

目前这是我的输出:


第一个用于选择整个列表

工会在第一个基础上增加第二个

您可能希望使用INTERSECT操作而不是UNION。这要求第一个选择中的记录与第二个选择中的记录具有某种标准。UNION运算符只是将第二个操作的记录附加到第一个操作的记录

这些操作记录在。

中,请查看是否这样做:

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:我不喜欢表名或列名的所有大写字母,也不喜欢任何其他数据库对象。

此查询应该会为体验积分最高并玩过暴雪游戏的用户提供帮助

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

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

我简单地玩了一下INTERSECT,但它始终没有给我任何提示,还有其他提示吗?也许你应该尝试将第二个选项中的where子句添加到第一个选项中的where子句中,然后将UNION和第二个子句一起去掉。WHERE子句就是WHERE gsExperiencePoints=SELECT MAXgsExperiencePoints FROM GAME_STAT AND devName='Blizzard Entertainment',我试过了,但它也没有给我任何东西,我被告知要把这个问题看成两个问题,并把它们放在一起。实际上,因为您确实需要游戏统计数据,所以它可能应该是lead表,其中包含其他表中加入的其他信息,并且WHERE子句也相应地进行了调整。这里有一些建议:当您在SQL语句中加入了JOIN时,请始终使用别名限定所有字段。处处我真的不想在不知道列是从哪个表中选择的情况下查看这样的查询。问题:为什么在字段上使用GROUP BY,而没有像eg SUM这样的聚合函数?您的意思是选择不同的值吗?在这种情况下,请选择DISTINCT。。。如果没有组员,听起来你实际上不需要或不想要工会。你是想选择哪个“暴雪娱乐”开发者的经验值最高吗?@kicken我想找到哪个玩过“暴雪娱乐”游戏的人的经验值最高,让他看看RandyTroy@TT. 我不确定为什么我把小组放在旁边,我有时倾向于这样做,但不管怎样,我在主帖子中添加了表格。在任何情况下,如果不需要分组,就不应该将它们放在查询中。对于更复杂和涉及大量数据的查询,这可能会对性能产生相当大的影响。嘿,我多次编辑了我的答案,我想我得到了您想要的。如果您将来有任何问题,最好包含一个表布局和示例数据,以便更容易处理。请参阅本文:。
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