Повторите строку на основе значений в столбце - PullRequest
0 голосов
/ 01 декабря 2018

Уважаемое сообщество StackOverflow,

У меня есть таблица со следующими данными.Я хочу иметь возможность создавать n строки на основе 5 - value in column E.Также нужно иметь возможность сделать значение в столбце F нулевым, сохраняя значения для A, B, C, D нетронутыми.

Я не в состоянии создать временную таблицу.

INPUT

Table1

A    B    C    D    E    F
AA   BB   CC   DD   1    100
AA   BB   CC   DD   3    200
AA   BB   CC   DD   5    300
EE   FF   GG   HH   1    600

Table2

key      desc
1        AABBCCDD
2        EEFFGGHHH

ВЫХОД

A    B    C    D    E    F    key
AA   BB   CC   DD   1    100  1
AA   BB   CC   DD   3    200  1
AA   BB   CC   DD   5    300  1
AA   BB   CC   DD   2    0    1
AA   BB   CC   DD   4    0    1
EE   FF   GG   HH   1    600  2
EE   FF   GG   HH   2    0    2
EE   FF   GG   HH   3    0    2
EE   FF   GG   HH   4    0    2
EE   FF   GG   HH   5    0    2

Мой существующий SQL выглядит следующим образом.

SELECT A.*,B.key from table1 as A
JOIN table2 as B on concat(A.A,A.B,A.C) = B.desc;

1 Ответ

0 голосов
/ 01 декабря 2018

Вам нужно каким-то образом соединить список номеров.

Одним из способов является использование таблицы подсчета с достаточным количеством чисел.

Затем соедините эти числа со всеми уникальными A, B, C, D.
Это даст основу для всех возможных комбинаций.

Затем СЛЕДУЙТЕ СОЕДИНИТЬ таблицы с этим результатом.

Тест по SQL Fiddle здесь

SELECT 
 Abcd.A, Abcd.B, Abcd.C, Abcd.D, 
 Nums.n as E, 
 COALESCE(t1.F, 0) as F, 
 t2.`key`
FROM (
  SELECT MIN(E) AS MinE, MAX(E) AS MaxE, MAX(F) AS MaxF FROM Table1
) AS Limits
JOIN Nums ON n BETWEEN Limits.MinE AND Limits.MaxE
JOIN (
  SELECT DISTINCT A, B, C, D FROM Table1
) AS Abcd
LEFT JOIN Table1 AS t1 ON (t1.A, t1.B, t1.C, t1.D) = (Abcd.A, Abcd.B, Abcd.C, Abcd.D) AND t1.E = Nums.n
LEFT JOIN Table2 AS t2 ON t2.`desc` LIKE CONCAT(Abcd.A, Abcd.B, Abcd.C, Abcd.D, '%')
ORDER BY Abcd.A, Abcd.B, Abcd.C, Abcd.D, COALESCE(t1.F, Limits.MaxF), Nums.n;

Пример используемых данных:

create table Table1 (A varchar(2), B varchar(2), C varchar(2), D varchar(2), E int, F int); 

create table Table2 (`key` int primary key auto_increment, `desc` varchar(30));

insert into Table1 (A, B, C, D, E, F) values
('AA','BB','CC','DD',1,100),
('AA','BB','CC','DD',3,200),
('AA','BB','CC','DD',5,300),
('EE','FF','GG','HH',1,600);

insert into Table2 (`desc`) values
('AABBCCDD'),
('EEFFGGHH');

 CREATE TABLE Nums (n int primary key);

 INSERT INTO Nums (n) VALUES
 (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...