我正在寻找以下内容:
需要具有此条件的行:设备列的常用值和两个表中接口列的前三个字符。
然后从Table1中匹配上述条件的行,取出Specified列的值,存储在上述条件匹配的行的Table2的Avgin列中。
有人可以帮我吗?数据库是 MySQL。
我正在寻找以下内容:
需要具有此条件的行:设备列的常用值和两个表中接口列的前三个字符。
然后从Table1中匹配上述条件的行,取出Specified列的值,存储在上述条件匹配的行的Table2的Avgin列中。
有人可以帮我吗?数据库是 MySQL。
如果有多个匹配项,则仅使用第一个匹配项。如果没有,将使用 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()
UPDATE
withJOIN
是您在这里需要的,如下所示:
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) |
使用它来确认您获得了您期望的行(即在更新任何内容之前):
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。