基于双JOIN中WHERE的结果INSERT INTO

时间:2011-07-28 01:15:47

标签: mysql sql

首先,架构不是我的。这太可怕而且非常令人困惑。还有一个警告 - 这很复杂。

我有3个表格 - tbl_atbl_btbl_cswitch实际上是tbl_a中实体(记录)的属性。但只能通过JOIN上的tbl_b然后tbl_c访问:

  +---------+         +---------+         +---------+
  |  tbl_a  |         |  tbl_b  |         |  tbl_c  |
  +---------+         +---------+         +---------+
  | a_id    |    +--> | b_id    |    +--> | c_id    |
  | b_fk    | <--+    | c_fk    | <--+    | switch  |
  +---------+         +---------+         +---------+

  +---------+
  | tbl_his |
  +---------+
  | his_id  |
  | a_fk    |
  | coef    |
  +---------+

要添加功能,我需要创建第四个表(tbl_his) - 我已经完成了。在此表中,我有一个coef列,可以取1到100之间的任意数字。我需要在每个tbl_his的记录中填充表tbl_a一个记录。目前的数据switch可以是0,也可以是1

对于tbl_aswitch 0 tbl_his的每条记录,我应该将记录添加到NULL, 'a_id', '100'作为
 1

如果记录的开关是tbl_his,我应该将以下记录添加到NULL, 'a_id', '50'
 50

这个查询会完成一半的工作吗?有可能一次性同时执行100条记录和INSERT INTO `tbl_his` (`his_id`, `a_fk`, `coef`) VALUES (NULL, 'tbl_a.id', '100') WHERE ( SELECT tbl_a.id FROM tbl_a LEFT JOIN tbl_b ON tbl_a.b_fk = tbl_b.id LEFT JOIN tbl_c ON tbl_b.c_fk = tbl_c.c_id WHERE tbl_c.switch = '0') 条记录吗?

{{1}}

2 个答案:

答案 0 :(得分:3)

没有INSERT INTO...WHERE查询语法这样的东西。你想要的是INSERT INTO...SELECT

INSERT INTO 
  tbl_his (a_fk, coef) 
SELECT 
  tbl_a.id, 
  CASE WHEN tbl_c.switch = 0 THEN 100 ELSE 50 END
FROM
  tbl_a
LEFT JOIN
  tbl_b
ON
  tbl_a.b_fk = tbl_b.id
LEFT JOIN
  tbl_c
ON
  tbl_b.c_fk = tbl_c.c_id

MySQL Manual :: Control Flow Functions

答案 1 :(得分:1)

将LEFT放在连接上。你的where子句在非法的地方。插入查询中的值并计算coef。如果所有开关值均为0或1,则可以删除最后一行。

INSERT INTO tbl_his (his_id, a_fk, coef)
  SELECT NULL, tbl_a.id, 100-50*tbl_c.switch
  FROM tbl_a 
  JOIN tbl_b ON tbl_a.b_fk = tbl_b.id
  JOIN tbl_c ON tbl_b.c_fk = tbl_c.c_id
  WHERE switch BETWEEN 0 AND 1;