我正在寻找以下内容:
需要具有以下条件的行:Device列的公共值和两个表中Interface列的前三个字符。
然后从Table1匹配上述条件的行,检索Specified列的值并将其存储在上述条件匹配的行中Table2的Avgin列中。
有人可以帮助我吗?数据库是MySQL。
答案 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
将允许您在连接成功的情况下使用默认值(因为device
和interface
的前三个字符对两个表都是通用的),但是{ {1}}具有该行的NULL值。