如何在 INSERT INTO SELECT 中使用 JOIN 但在匹配列时创建条件?
How to use JOIN in INSERT INTO SELECT but create condition when matching the columns?
我有 3 个 tables、staging、positions_mapping 和 target .
分期table
id
pos_name
4
SM
5
Agile Scrum Master
6
Scrum Master
positions_mapping table
id
position_name
1
Agile Scrum Master
并且在 目标 table 上,我打算像这样从暂存中插入这些行:
id
position_id
14
1
15
1
16
1
起初我使用 JOINS 来做到这一点:
INSERT INTO target(position_id)
SELECT positions_mapping.id FROM staging
LEFT JOIN positions_mapping ON positions_mapping.position_name = staging.pos_name
但这仅适用于完全匹配。敏捷 Scrum Master 的不同名称出现了,我仍然需要将它们插入 "Agile Scrum Master",无论它是否完全匹配。
我想在此处添加条件语句?我不太确定将它们放在哪里。
通过完整的 zexz 搜索,您可能会喜欢其中两行,但第一行是通用的。
但是因为你不能 ppu 另一个列的任何列 table 你需要一个动态的方法
CREATE TABLE staging (
`id` INTEGER,
`pos_name` VARCHAR(18),
FULLTEXT KEY (pos_name )
);
INSERT INTO staging
(`id`, `pos_name`)
VALUES
('4', 'SM'),
('5', 'Agile Scrum Master'),
('6', 'Scrum Master');
CREATE TABLE positions_mapping (
`id` INTEGER,
`position_name` VARCHAR(18)
);
INSERT INTO positions_mapping
(`id`, `position_name`)
VALUES
('1', 'Agile Scrum Master');
PREPARE stat FROM "SELECT s.`id`,pm.`id`
FROM staging s JOIN positions_mapping pm ON MATCH (s.`pos_name` ) AGAINST (?) > 0";
SET @c_val = (SELECT `position_name` FROM positions_mapping WHERE `position_name` = 'Agile Scrum Master');
EXECUTE stat USING @c_val;
✓
✓
id | id
-: | -:
5 | 1
6 | 1
db<>fiddle here
您可以在 ON
子句中使用 CASE
语句。类似于:
positions_mapping.position_name = CASE WHEN staging.pos_name IN ('SM', 'Scrum Master') then 'Agile Scrum Master' ELSE staging.pos_name END
这确实需要对所有特殊情况进行硬编码,但除非您在某处有映射或可靠的转换模式,否则您几乎肯定必须这样做。
我有 3 个 tables、staging、positions_mapping 和 target .
分期table
id | pos_name |
---|---|
4 | SM |
5 | Agile Scrum Master |
6 | Scrum Master |
positions_mapping table
id | position_name |
---|---|
1 | Agile Scrum Master |
并且在 目标 table 上,我打算像这样从暂存中插入这些行:
id | position_id |
---|---|
14 | 1 |
15 | 1 |
16 | 1 |
起初我使用 JOINS 来做到这一点:
INSERT INTO target(position_id)
SELECT positions_mapping.id FROM staging
LEFT JOIN positions_mapping ON positions_mapping.position_name = staging.pos_name
但这仅适用于完全匹配。敏捷 Scrum Master 的不同名称出现了,我仍然需要将它们插入 "Agile Scrum Master",无论它是否完全匹配。
我想在此处添加条件语句?我不太确定将它们放在哪里。
通过完整的 zexz 搜索,您可能会喜欢其中两行,但第一行是通用的。
但是因为你不能 ppu 另一个列的任何列 table 你需要一个动态的方法
CREATE TABLE staging ( `id` INTEGER, `pos_name` VARCHAR(18), FULLTEXT KEY (pos_name ) ); INSERT INTO staging (`id`, `pos_name`) VALUES ('4', 'SM'), ('5', 'Agile Scrum Master'), ('6', 'Scrum Master');
CREATE TABLE positions_mapping ( `id` INTEGER, `position_name` VARCHAR(18) ); INSERT INTO positions_mapping (`id`, `position_name`) VALUES ('1', 'Agile Scrum Master');
PREPARE stat FROM "SELECT s.`id`,pm.`id` FROM staging s JOIN positions_mapping pm ON MATCH (s.`pos_name` ) AGAINST (?) > 0"; SET @c_val = (SELECT `position_name` FROM positions_mapping WHERE `position_name` = 'Agile Scrum Master'); EXECUTE stat USING @c_val;
✓ ✓ id | id -: | -: 5 | 1 6 | 1
db<>fiddle here
您可以在 ON
子句中使用 CASE
语句。类似于:
positions_mapping.position_name = CASE WHEN staging.pos_name IN ('SM', 'Scrum Master') then 'Agile Scrum Master' ELSE staging.pos_name END
这确实需要对所有特殊情况进行硬编码,但除非您在某处有映射或可靠的转换模式,否则您几乎肯定必须这样做。