我正在尝试解决一个难题,但无法集中注意力。解决方案最好是在 DB2 中,但其他 SQL 变体也是可以接受的。
假设我们有这张表,列出了车主及其汽车(每个车主可以拥有多于一辆汽车):
car_owners:
Owner Make Model Address Phone
1 Toyota Corolla first street 11111
1 Ford Mustang first street 11111
2 Toyota Corolla second street 22222
2 Audi A7 second street 22222
2 Porsche 911 second street 22222
3 Toyota Prius third street 33333
然后我们有这张表,其中包含汽车功能及其代码:
car_features_codes:
Code Feature
1 sedan
2 not sedan
3 ABS
4 no ABS
5 automatic
6 not automatic
7 gasoline
8 no gasoline
请注意,该表有 4 个特征,每个特征都有一个“是”或“否”代码,因此总共有 8 个代码,并且这些代码是连续的数字。
最后,我们有这张汽车功能表:
car_features:
Owner Make Model Feature
1 Ford Mustang 2
1 Ford Mustang 3
1 Ford Mustang 6
1 Ford Mustang 7
3 Toyota Prius 1
3 Toyota Prius 5
2 Porsche 911 2
2 Porsche 911 3
2 Porsche 911 5
2 Porsche 911 7
请注意,在所有 4 个功能中,野马和保时捷拥有所有这些,普锐斯只有 2 个,其他汽车都没有。
现在的挑战是用第一个表中所有汽车的所有功能填充最后一个表,并使用第二个表中的“负”代码作为默认值。例如:如果汽车没有代码7和8,则填写8(不含汽油)。如果缺少5或6,则填写6。如果缺少1或2,则填写2。以此类推
最终的“car_features”表应该总共有
X*4
行(X 是第一个表的汽车数量,每辆车都具有所有 4 个功能),保留表中已有的行。
我已尝试使用 INSERT 语句进行多个查询,但不知道如何执行。
要生成不存在的行,可以使用 2 个集合的
CROSS JOIN
(笛卡尔积)。这里我们需要现有车主交叉加入负面特征。这确保了结果中存在所有所有者和所有负代码。然后我们将该结果加入到商店护理所有者信息中,以便我们可以识别和丢失的行(即您想要插入的行):
INSERT INTO car_features (Owner, Make, Model, Feature)
WITH temp AS (
SELECT o.Owner, o.Make, o.Model, c.Code as Feature
FROM car_owners o
CROSS JOIN car_features_codes c
WHERE c.feature LIKE 'no%'
)
SELECT t.Owner, t.Make, t.Model, t.Feature
FROM temp t
LEFT JOIN car_features f
ON t.Owner = f.Owner AND t.Make = f.Make AND t.Model = f.Model AND t.Feature = f.Feature
WHERE f.Feature IS NULL
插入后的行:
+-------+---------+---------+---------+
| OWNER | MAKE | MODEL | FEATURE |
+-------+---------+---------+---------+
| 1 | Ford | Mustang | 2 |
| 1 | Ford | Mustang | 3 |
| 1 | Ford | Mustang | 6 |
| 1 | Ford | Mustang | 7 |
| 3 | Toyota | Prius | 1 |
| 3 | Toyota | Prius | 5 |
| 2 | Porsche | 911 | 2 |
| 2 | Porsche | 911 | 3 |
| 2 | Porsche | 911 | 5 |
| 2 | Porsche | 911 | 7 |
| 1 | Toyota | Corolla | 2 |
| 2 | Toyota | Corolla | 2 |
| 2 | Audi | A7 | 2 |
| 3 | Toyota | Prius | 2 |
| 1 | Toyota | Corolla | 4 |
| 1 | Ford | Mustang | 4 |
| 2 | Toyota | Corolla | 4 |
| 2 | Audi | A7 | 4 |
| 2 | Porsche | 911 | 4 |
| 3 | Toyota | Prius | 4 |
| 1 | Toyota | Corolla | 6 |
| 2 | Toyota | Corolla | 6 |
| 2 | Audi | A7 | 6 |
| 2 | Porsche | 911 | 6 |
| 3 | Toyota | Prius | 6 |
| 1 | Toyota | Corolla | 8 |
| 1 | Ford | Mustang | 8 |
| 2 | Toyota | Corolla | 8 |
| 2 | Audi | A7 | 8 |
| 2 | Porsche | 911 | 8 |
| 3 | Toyota | Prius | 8 |
+-------+---------+---------+---------+
参见小提琴