2

我正在尝试查询三个不同表之一中存在的一个唯一 id 值。

这三个表具有分层的主键 ID 集,例如

t1 = 1-9 
t2 = 10-19 
t3 = 20-29 

这些表是optgroup菜单的一部分,PK 用作选择值。这是一个多选功能,因此用户最多可以选择 3 个值——它们都可以来自这些表中的一个,也可以来自每个表中的一个。

每个选择都存储在目标表的单独列中,例如value1,。如果仅传递一个值,则其他列为.value2value3NULL

我的问题——我有一个原始数据的 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 .. 我在这里完全脱离了我的元素,但这更接近于说明我想要完成的事情。

4

2 回答 2

0

如果您可以创建视图,那么您可以创建所有表的并集并搜索该表以构建您的表。就像是:

CREATE VIEW all AS
  select * from table1 union
  select * from table2 union
  select * from table3;

SELECT
  (select id from all where name = value1) as value1,
  (select id from all where name = value2) as value2,
  (select id from all where name = value3) as value3,
  user
FROM temp;
于 2012-09-19T07:09:40.590 回答
0

像这样的东西怎么样:

SELECT a.id, a.t_name
FROM
    (SELECT id, t1_name AS t_name FROM t1
    UNION ALL
    SELECT id, t2_name AS t_name FROM t2
    UNION ALL
    SELECT id, t2_name AS t_name FROM t3) a
WHERE a.id IN ('value1', 'value2', 'value3')

更新 1

在得到一些样本数据后,我认为这是你想要去的方向:

SELECT a.v1, a.v2, a.v3
FROM
    (SELECT id AS v1, NULL AS v2, NULL AS v3 FROM t1
    UNION ALL
    SELECT NULL AS v1, id AS v2, NULL AS v3 FROM t2
    UNION ALL
    SELECT NULL AS v1, NULL AS v2, id AS v3 FROM t3) a
WHERE a.v1 = someId OR a.v2 = someId OR a.v3 = someId
于 2012-09-18T20:03:22.910 回答