MySQL: вставка записей практически в оператор SELECT - PullRequest
0 голосов
/ 22 февраля 2019

Я получаю набор результатов следующим образом

C1     C2   C3
10     2    T
10     3    E
10     6    S

Я хочу, чтобы мой запрос SELECT таким образом, чтобы результирующие записи могли выглядеть как

C1     C2   C3
10     2    T
10     3    E
10     4
10     5
10     6    S

, где есть пустая строказа отсутствующие записи.Не могу понять то же самое.

Исходный запрос: select C1, C2,C3 from Table

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Вы можете создать таблицу последовательных чисел в вашей базе данных, а затем использовать внешнее объединение, чтобы заполнить пропущенные значения строки для C2.Это будет очень полезно для других запросов и занимает очень мало места.

CREATE TABLE Numbers (Number INTEGER PRIMARY KEY);
INSERT INTO Numbers (Number) VALUES (1),(2),(3),(4),(5),(6) ...

А затем:

SELECT T.C1, N.Number AS C2, T.C3 
FROM Numbers AS N LEFT OUTER JOIN T ON T.C2 = N.Number
WHERE N.Number BETWEEN (SELECT MIN(C2) FROM T) AND (SELECT MAX(C2) FROM T)
ORDER BY C2;

HTH

0 голосов
/ 22 февраля 2019

Если ваша версия mysql выше 8.0, вы можете попытаться с помощью cte RECURSIVE создать таблицу календаря, а затем выполнить outer join

Схема (MySQL v8.0)

CREATE TABLE T(
  C1 int, 
  C2 int,
  C3 varchar(5)
);


INSERT INTO T VALUES (10,2,'T');
INSERT INTO T VALUES (10,3,'E');
INSERT INTO T VALUES (10,6,'S');

Запрос № 1

WITH RECURSIVE CTE AS (
    SELECT C1,MIN(C2) minC2,MAX(C2) maxC2
    FROM T
    GROUP BY C1
    UNION ALL 
    SELECT C1,minC2 +1,maxC2
    FROM CTE
    WHERE minC2+1 <= maxC2
)
SELECT t1.C1,t1.minC2,t2.C3
FROM CTE t1 LEFT JOIN T t2 on t1.minC2 = t2.C2
ORDER BY C1,minC2;

| C1  | minC2 | C3  |
| --- | ----- | --- |
| 10  | 2     | T   |
| 10  | 3     | E   |
| 10  | 4     |     |
| 10  | 5     |     |
| 10  | 6     | S   |

Просмотр на БД Fiddle

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