MySQL查询,从一个表中查找并插入到第二个表中

时间:2013-04-07 06:18:21

标签: mysql sql sql-update

我正在寻找以下内容:

enter image description here

  • 需要具有以下条件的行:Device列的公共值和两个表中Interface列的前三个字符。

  • 然后从Table1匹配上述条件的行,检索Specified列的值并将其存储在上述条件匹配的行中Table2的Avgin列中。

有人可以帮助我吗?数据库是MySQL。

3 个答案:

答案 0 :(得分:2)

如果有多个匹配项,则仅使用第一个匹配项。 如果没有,则使用null。如果您想要其他内容,请使用ifnull()

UPDATE
  table2
SET
  avgin=ifnull(
    (
      SELECT
        Specified
      FROM
        table1
      WHERE
        table1.Device=table2.Device
        AND substring(table1.Interface,1,3)=substring(table2.Interface,1,3)
      LIMIT 1
    ),
    'default value'
  )

修改:添加了ifnull()

答案 1 :(得分:1)

UPDATE JOIN就是你需要的,就像这样:

UPDATE Table2 AS t2
INNER JOIN table1 AS t1  ON LEFT(t2.Interface, 3) = LEFT(t1.Interface, 3)
                        AND t1.Device             = t2.Device
SET t2.Avgin = t1.specified;

正如您在问题中所解释的那样JOIN条件:

 LEFT(t2.Interface, 3) = LEFT(t1.Interface, 3)
 AND 
 t1.Device             = t2.Device

LEFT会给你两张桌子左边的前3个字符。

请在此处查看:

这将使table2看起来像:

|         CID |       DEVICE | INTERFACE |  AVGIN |
---------------------------------------------------
| HDC-HKG-R01 | HDC-TBONE-P1 |   P09/0/0 | 121.36 |
| OCB-OCD-R01 |      OCB-PE1 |     Gi5/2 |   0.17 |
| HDC-BSA-R01 | HDC-TBONE-P1 |   Se9/2/0 | (null) |

答案 2 :(得分:1)

用此确认您获得了您期望的行(即 BEFORE 更新任何内容):

SELECT
  t1.Specified

FROM
  table2 t2

  INNER JOIN table1 t1
  ON t1.device = t2.device
  AND LEFT(t1.interface,3) = LEFT(t2.interface,3)

然后,假设是对的:

  UPDATE table2 t2

  INNER JOIN table1 t1
  ON t1.device = t2.device
  AND LEFT(t1.interface,3) = LEFT(t2.interface,3)

  SET t2.Avgin = ifnull(t1.specified,'Default Value For When t1.Specified is NULL')

注意我们正在使用INNER连接...这意味着table2中没有table1中相应行的行将从结果中丢弃(这就是你想要的)。

IFNULL将允许您在连接成功的情况下使用默认值(因为deviceinterface的前三个字符对两个表都是通用的),但是{ {1}}具有该行的NULL值。