【问题标题】:Query for show each value from another table查询显示另一个表中的每个值
【发布时间】:2015-12-19 14:03:48
【问题描述】:

我不知道我的标题问题是否正确,但让我解释一下我在寻找什么。

我有两张桌子。

用户评分

user (primary key)
game (varchar)
score (int)

游戏

game (varchar)

客户用户评分数据如下所示

user    game             score
Chris   naruto           10
Gale    dungen           9
Donna   winning eleven   8

游戏桌数据如下所示

game
dungen
naruto
winning eleven

是否可以创建一个看起来像这样的视图:

user      game                score
Chris     naruto              10
          dungen              0 
          winning eleven      0
Gale      naruto              0
          dungen              9
          winning eleven      0
Donna     naruto              0
          dungen              0
          winning eleven      8

提前致谢。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    您首先需要使用交叉连接获得一组不同的用户+游戏所有可能组合:

    select distinct u.user, g.game
    from game g
    cross join user u
    ;
    

    这将给出以下结果:

    |  USER |           game |
    |-------|----------------|
    | Chris |         dungen |
    | Chris |         naruto |
    | Chris | winning eleven |
    |  Gale |         dungen |
    |  Gale |         naruto |
    |  Gale | winning eleven |
    | Donna |         dungen |
    | Donna |         naruto |
    | Donna | winning eleven |
    

    然后您可以通过这种方式将此结果集(使用外连接)加入user 表:

    SELECT * 
    FROM (
        select distinct u.user, g.game
        from game g
        cross join user u
    ) x
    LEFT JOIN user u ON x.user = u.user and x.game = u.game
    ;
    

    以上查询为您提供以下结果集:

    |  user |           game |   USER |           game |  score |
    |-------|----------------|--------|----------------|--------|
    | Chris |         naruto |  Chris |         naruto |     10 |
    |  Gale |         dungen |   Gale |         dungen |      9 |
    | Donna | winning eleven |  Donna | winning eleven |      8 |
    | Chris |         dungen | (null) |         (null) | (null) |
    | Chris | winning eleven | (null) |         (null) | (null) |
    |  Gale |         naruto | (null) |         (null) | (null) |
    |  Gale | winning eleven | (null) |         (null) | (null) |
    | Donna |         dungen | (null) |         (null) | (null) |
    | Donna |         naruto | (null) |         (null) | (null) |
    

    接下来,您可以使用上述结果集通过简单的 SUM 和 GROUB BY 生成报告。
    但首先您需要将所有空值替换为 0,因为空值之和给出空值。
    这样:

    SELECT x.user, x.game, 
           sum( case when score is not null then score else 0 end ) as score
    FROM (
        select distinct u.user, g.game
        from game g
        cross join user u
    ) x
    LEFT JOIN user u ON x.user = u.user and x.game = u.game
    GROUP BY x.user, x.game
    order by x.user, x.game
    ;
    

    此查询产生以下结果:

    |  user |           game | score |
    |-------|----------------|-------|
    | Chris |         dungen |     0 |
    | Chris |         naruto |    10 |
    | Chris | winning eleven |     0 |
    | Donna |         dungen |     0 |
    | Donna |         naruto |     0 |
    | Donna | winning eleven |     8 |
    |  Gale |         dungen |     9 |
    |  Gale |         naruto |     0 |
    |  Gale | winning eleven |     0 |
    

    您可以在此处找到完整的可运行示例:http://sqlfiddle.com/#!9/657cdf/12

    我在这些示例中使用 SQL 的 MySql 方言,因为它在 SqlFiddle 上可用
    但我相信将其转换为 MS-Access 应该不是问题。

    === 编辑 - 如何将此查询转换为 MS-Access 方言 ===

    我已经在 MS-Access 2010 上测试了这个查询
    MS-Access 不支持的只有两件事:


    MS Access 不支持 CROSS JOIN 关键字。
    可以这样转换:How to use cross join in access?
    在表格之间使用“旧”语法和逗号:

    SELECT DISTINCT u.user, g.game
    FROM game g, user u
    

    MS-Access 不支持大小写表达式
    CASE WHEN condition THEN value1 ELSE value2 END
    但您可以使用 IIF 函数:
    IIF( condition, value1, value2 )
    更多信息在这里:Does MS Access support "CASE WHEN" clause if connect with ODBC?


    整个查询转换为 MS-Access 方言:

    SELECT x.user, x.game, 
           sum( IIF( u.score IS NOT NULL, u.score, 0)) as score
    FROM (
        SELECT DISTINCT u.user, g.game
        FROM game g, user u
    ) x
    LEFT JOIN user u ON x.user = u.user and x.game = u.game
    GROUP BY x.user, x.game
    ORDER BY x.user, x.game
    

    查询结果(在 MS-Access 中):

    【讨论】:

    • 提前感谢 kordirko 。我成功地用你在 Sql 中给出的 Sql 来展示它。但我不确定 Query Sql 是否可以在 Ms Access 中运行。你能在 MS Access 中给我一些线索吗:)。感谢之前
    • 我已经更正了答案,现在显示的是 MS-Access 版本的查询。
    • 非常感谢@kordirko ...我的问题已经通过您的指导解决了..:)
    猜你喜欢
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2021-08-30
    • 2018-11-14
    • 1970-01-01
    • 2018-07-02
    • 2018-09-14
    相关资源
    最近更新 更多