根据列中的值重复行

时间:2018-12-01 14:26:33

标签: mysql sql

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;

1 个答案:

答案 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);