Esteemed StackOverflow社区,
我有一张包含以下数据的表。我希望能够基于n
产生5 - value in column E
行。
还希望能够使列F
中的值保持零,同时保持A,B,C,D的值不变。
我无法创建临时表。
输入
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;
答案 0 :(得分:1)
您需要以某种方式交叉连接到数字列表。
一种方法是使用具有足够数字的计数表。
然后将这些数字与所有唯一的A,B,C,D结合起来。
这将为所有可能的组合奠定基础。
然后将表左联接到该结果。
在SQL Fiddle here上进行测试
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);