如何在 INSERT INTO SELECT 中使用 JOIN 但在匹配列时创建条件?

How to use JOIN in INSERT INTO SELECT but create condition when matching the columns?

我有 3 个 tables、stagingpositions_mappingtarget .

分期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

这确实需要对所有特殊情况进行硬编码,但除非您在某处有映射或可靠的转换模式,否则您几乎肯定必须这样做。