Присоединение таблицы к себе с нулевыми значениями - PullRequest
1 голос
/ 28 марта 2020

Я считаю, что должен быть простой способ сделать это, но я застрял здесь! Я прочитал более 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   |
+-----+-----+------+

По сути, я хочу, чтобы запрос заполнил все недостающие AID для PID s и добавьте NULL или NA для их значений Data. Я могу добиться этого, выполняя циклы вне MySQL, но это очень медленно, так как мне нужно запускать отдельные запросы для каждой комбинации PID и AID, чтобы получить значение 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`

1 Ответ

2 голосов
/ 28 марта 2020

Вы можете использовать подход календарной таблицы здесь:

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;

Идея здесь заключается в том, что мы генерируем все возможные комбинации PID и AID, используя перекрестное соединение между различными подзапросами с псевдонимом t1 и t2. Затем мы оставляем соединение с вашей фактической таблицей qu, которая либо вводит данные, если они доступны, либо NULL, если они недоступны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...