【问题标题】:Joining a Table to Itself with Null Values使用 Null 值将表连接到自身
【发布时间】:2020-03-28 04:39:48
【问题描述】:

我相信应该有一个简单的方法来做到这一点,但我被困在这里!我已经在这里和其他地方阅读了 20 多页,但找不到我想要的。

我有一个包含数千行和数十列的表,但为简化起见,让我们想象下表qu 是我的数据:

+----+-----+-----+------+
| id | PID | AID | Data |
+----+-----+-----+------+
|  1 | A   |   1 |   56 |
|  2 | A   |   2 |  234 |
|  3 | B   |   1 |   23 |
|  4 | B   |   2 |   78 |
|  5 | B   |   3 |   65 |
|  6 | C   |   2 |   89 |
|  7 | C   |   3 |   74 |
+----+-----+-----+------+

我想要一个生成以下结果的查询:

+-----+-----+------+
| PID | AID | Data |
+-----+-----+------+
| A   |   1 | 56   |
| A   |   2 | 234  |
| A   |   3 | NULL |
| B   |   1 | 23   |
| B   |   2 | 78   |
| B   |   3 | 65   |
| C   |   1 | NULL |
| C   |   2 | 89   |
| C   |   3 | 74   |
+-----+-----+------+

基本上,我希望查询为PIDs 填充所有缺少的AID,并为它们的Data 值添加NULLNA。我可以通过在 MySQL 之外执行循环来实现这一点,但这非常慢,因为我需要为每个 PIDAID 组合运行单独的查询以获得 Data 值。

这是我最近的一次尝试,但没有成功!

SELECT
    *
FROM
    (
    SELECT
        `id`,
        `PID`
    FROM
        `qu`
    GROUP BY
        `PID`
) `a`
LEFT OUTER JOIN(
    SELECT
        `id`,
        `AID`
    FROM
        `qu`
    GROUP BY
        `AID`
) `b`
ON
    `a`.`id` = `b`.`id`
LEFT OUTER JOIN `qu` `c` ON
    `a`.`id` = `c`.`id` AND `b`.`id` = `c`.`id`

【问题讨论】:

    标签: mysql join null


    【解决方案1】:

    您可以在这里使用日历表方法:

    SELECT
        q1.PID,
        q2.AID,
        q3.Data   -- or use COALESCE(q3.Data, 'NA') AS Data
    FROM (SELECT DISTINCT PID FROM qu) q1
    CROSS JOIN (SELECT DISTINCT AID FROM qu) q2
    LEFT JOIN qu q3
        ON q3.PID = q1.PID AND
           q3.AID = q2.AID
    ORDER BY
        q1.PID,
        q2.AID;
    

    这里的想法是,我们使用别名为t1t2 的不同子查询之间的交叉连接来生成PIDAID 的所有可能组合。然后,我们使用您的实际 qu 表离开 join,如果数据可用,该表将引入数据,否则 NULL 如果不可用。

    【讨论】:

    • 哇,蒂姆,你太棒了!从来不知道cross join。谢谢!我为此花了2天多的时间! :)
    • 如何获取自定义值而不是NULL,例如NA
    猜你喜欢
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多