我正在尝试查询三个不同表之一中存在的一个唯一 id 值。
这三个表具有分层的主键 ID 集,例如
t1 = 1-9
t2 = 10-19
t3 = 20-29
这些表是optgroup
菜单的一部分,PK 用作选择值。这是一个多选功能,因此用户最多可以选择 3 个值——它们都可以来自这些表中的一个,也可以来自每个表中的一个。
每个选择都存储在目标表的单独列中,例如value1
,。如果仅传递一个值,则其他列为.value2
value3
NULL
我的问题——我有一个原始数据的 CSV 文件转储到临时表中。临时表中的每一行都有代表这些值的三个现有列,但它们当前也是在三个表中找到的字符串值,而不是id
. 需要将此数据插入到另一个表设置中,并使用适用于该应用程序的适当 FK。
如何查询现有的三个表,查找与三个表id
中的任何一个匹配的给定字符串的值,然后在同一查询中再执行 2 次,以获取临时表中剩余的“值”列排?
编辑
更多示例数据进行说明:
临时表中的数据:
temp
+---------+---------+---------+--------+
| value1 | value2 | value3 | user |
+---------+---------+---------+--------+
| primary | light | red | greg |
| red | blue | NULL | sarah |
| neutral | orange | green | tim |
| dark | blue | green | laura |
+---------+---------+---------+--------+
需要插入到另一个表中。列的 idvalueX
存在于三个表中:
table 1
+---------+---------+
| id | name |
+---------+---------+
| 003 | neutral |
| 004 | dark |
| 005 | light |
+---------+---------+
table 2
+---------+---------+
| id | name |
+---------+---------+
| 010 | blue |
| 011 | orange |
| 012 | red |
| 013 | green |
+---------+---------+
table 3
+---------+---------------+
| id | name |
+---------+---------------+
| 020 | primary |
| 021 | complimentary |
| 022 | secondary |
+---------+---------------+
临时表中的其他列(user
在本例中)是插入的一部分,它会像这样填充目标表:
target
+---------+---------+---------+-------+
| value1 | value2 | value3 | user |
+---------+---------+---------+-------+
| 020 | 005 | 012 | greg |
| 012 | 010 | NULL | sarah |
| 003 | 011 | 013 | tim |
| 004 | 010 | 013 | laura |
+---------+---------+---------+-------+
我最接近的尝试是能够获取第一列值,但我不知道如何在同一个查询中获取其他两个值。
INSERT INTO target (user, value1, value2, value3)
SELECT t.user, a.id, X, X
FROM temp t,
(SELECT * FROM table1
UNION
SELECT * FROM table2
UNION
SELECT * FROM table3) as a
WHERE a.name = t.value1
AND X = t.value2
AND X = t.value3
试图解决 X .. 我在这里完全脱离了我的元素,但这更接近于说明我想要完成的事情。