我有一张包含客户,产品和广告的表格。秩。该表位于客户 - 产品级别,每个客户最多有5个产品。当我的产品少于5个时,我想从另一个表中填写数据,所以有5个。
原始表:
| Customer | Product | Rank |
|----------|---------|------|
| 123456 | 456 | 1 |
| 123456 | 457 | 2 |
| 123456 | 458 | 3 |
| 234567 | 234 | 1 |
| 234567 | 235 | 2 |
| 234567 | 236 | 3 |
| 234567 | 237 | 4 |
| 234567 | 238 | 5 |
| 345678 | 712 | 1 |
| 345678 | 713 | 2 |
填写表格:
| Product | Rank |
|---------|------|
| 123 | 1 |
| 124 | 2 |
| 125 | 3 |
| 126 | 4 |
| 127 | 5 |
结果我正在寻找:
| Customer | Product | Rank |
|----------|---------|------|
| 123456 | 456 | 1 |
| 123456 | 457 | 2 |
| 123456 | 458 | 3 |
| 123456 | 123 | 4 |
| 123456 | 124 | 5 |
| 234567 | 234 | 1 |
| 234567 | 235 | 2 |
| 234567 | 236 | 3 |
| 234567 | 237 | 4 |
| 234567 | 238 | 5 |
| 345678 | 712 | 1 |
| 345678 | 713 | 2 |
| 345678 | 123 | 3 |
| 345678 | 124 | 4 |
| 345678 | 125 | 5 |
编辑:我应该提到我希望首先插入排名最高的行。因此,产品123应该是客户123456的排名4
答案 0 :(得分:1)
您可以使用insert . . . select
:
insert into original(customer, product, rank)
select c.customer, f.product, f.rank
from (select distinct customer from original) c cross join
fillin f left join
original o
on o.customer = c.customer and o.rank = f.rank
where o.rank is null;
您可以运行子查询来获取缺失的值。
这个想法是生成“填充”的所有可能组合。然后删除已有值的那些。
编辑:
哎呀,我认为填表中的排名是最终排名。但你仍然可以这样做:insert into original(customer, product, rank)
select c.customer, f.product, f.rank
from (select customer, max(rank) as maxrank from original) c cross join
fillin f left join
original o
on o.customer = c.customer and o.rank - o.maxrank + 1 = f.rank;