1

我正在寻找以下内容:

在此处输入图像描述

  • 需要具有此条件的行:设备列的常用值和两个表中接口列的前三个字符。

  • 然后从Table1中匹配上述条件的行,取出Specified列的值,存储在上述条件匹配的行的Table2的Avgin列中。

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

4

3 回答 3

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()

于 2013-04-07T06:29:48.763 回答
1

UPDATEwithJOIN是您在这里需要的,如下所示:

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) |
于 2013-04-07T06:32:30.190 回答
1

使用它来确认您获得了您期望的行(即在更新任何内容之前):

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将允许您在连接成功的情况下使用默认值(因为两个表device的前三个字符interface是通用的),但table1.specified该行的值为 NULL。

于 2013-04-07T06:34:11.357 回答