SQL 难题 - 为所有二进制功能插入缺失的行

问题描述 投票:0回答:1

我正在尝试解决一个难题,但无法集中注意力。解决方案最好是在 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 语句进行多个查询,但不知道如何执行。

sql db2
1个回答
0
投票

要生成不存在的行,可以使用 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 |
+-------+---------+---------+---------+

参见小提琴

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.