MySQL查询,从一个表中查找并插入到第二个表中
我正在寻找以下信息: 需要具有以下条件的行:两个表中设备列的公共值和接口列的前三个字符 然后,从表1中匹配上述条件的行,检索指定列的值,并将其存储在表2中匹配上述条件的行的Avgin列中MySQL查询,从一个表中查找并插入到第二个表中,mysql,sql,sql-update,Mysql,Sql,Sql Update,我正在寻找以下信息: 需要具有以下条件的行:两个表中设备列的公共值和接口列的前三个字符 然后,从表1中匹配上述条件的行,检索指定列的值,并将其存储在表2中匹配上述条件的行的Avgin列中 有人能帮我吗?数据库是MySQL。如果有多个匹配项,则只使用第一个匹配项。 如果没有,将使用null。如果您想要其他内容,请使用ifnull 编辑:添加了ifnull如果有多个匹配项,则仅使用第一个匹配项。 如果没有,将使用null。如果您想要其他内容,请使用ifnull 编辑:添加了ifnull更新和JOIN
有人能帮我吗?数据库是MySQL。如果有多个匹配项,则只使用第一个匹配项。 如果没有,将使用null。如果您想要其他内容,请使用ifnull
编辑:添加了ifnull如果有多个匹配项,则仅使用第一个匹配项。 如果没有,将使用null。如果您想要其他内容,请使用ifnull 编辑:添加了ifnull更新和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;
对于连接条件,正如您在问题中所解释的:
LEFT(t2.Interface, 3) = LEFT(t1.Interface, 3)
AND
t1.Device = t2.Device
将给出两个表左侧的前3个字符
请在此处查看它的实际操作:
这将使表2看起来像:
| 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) |
使用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;
对于连接条件,正如您在问题中所解释的:
LEFT(t2.Interface, 3) = LEFT(t1.Interface, 3)
AND
t1.Device = t2.Device
将给出两个表左侧的前3个字符
请在此处查看它的实际操作:
这将使表2看起来像:
| 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')
请注意,我们使用的是内部联接。。。这意味着表2中没有对应行的行将从结果中丢弃,这正是您想要的
IFNULL将允许您在连接成功的情况下使用默认值,因为设备和接口的前三个字符对两个表都是公用的,但table1.specified对该行具有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')
请注意,我们使用的是内部联接。。。这意味着表2中没有对应行的行将从结果中丢弃,这正是您想要的
IFNULL将允许您在连接成功的情况下使用默认值,因为设备和接口的前三个字符对两个表都是公用的,但table1.specified对该行有一个NULL值。Hi,谢谢!它起作用了,但是我应该如何使用ifnull呢?我是MySQL的新手。有没有办法把两个答案设为正确答案???你和马哈茂德·贾马尔都是对的……嗨,谢谢!它起作用了,但是我应该如何使用ifnull呢?我是MySQL的新手。有没有办法把两个答案设为正确答案???你和马哈茂德·贾马尔都是对的。马哈茂德·贾马尔的解决方案如我所愿。无论如何,谢谢:@Sanchit也用IFNULL更新了这个答案,以防您对这个语法感兴趣。@Sepster您当前的IFNULL实现将无法工作,因为您使用的是内部联接,将不对应的行保留在范围之外。您可以尝试使用左联接。@nl-x不正确。。。当设备和接口上的内部联接成功时,指定的列可以为NULL。也就是说,当table1中不存在匹配项时,table2.avgin保留为null;如果t1.specified列不为null,则更新为该列包含的任何列;或者,当table1.specified为null时,更新为硬编码的默认列。归结到OP真正想要什么。。。他的评论,但我应该如何使用ifnull以及在何处使用ifnull并不是一个详细的需求规范;-,但我相信这个答案涵盖了所有的基础。马哈茂德·贾马尔的解决方案如我所愿。无论如何,谢谢:@Sanchit也用IFNULL更新了这个答案,以防您对这个语法感兴趣。@Sepster您当前的IFNULL实现将无法工作,因为您使用的是内部联接,将不对应的行保留在范围之外。您可以尝试使用左联接。@nl-x不正确。。。当设备和接口上的内部联接成功时,指定的列可以为NULL。也就是说,当table1中不存在匹配项时,table2.avgin保留为null;如果t1.specified列不为null,则更新为该列包含的任何列;或者,当table1.specified为null时,更新为硬编码的默认列。归结到OP真正想要什么。。。他的评论,但我应该如何使用ifnull以及在何处使用ifnull并不是一个详细的需求规范;-,但我相信这个答案涵盖了所有的基础。难道我没有办法把两个答案作为正确答案吗???你和nl-x都是对的。@Sanchit不这么认为。您实际将使用哪种解决方案?有内部联接的还是有子查询的?否则,哪种解决方案是第一个?@Sanchit Its al对,谁的答案被接受并不重要,但我认为nl-x答案更好,而且他比我更快。你真好,马哈茂德·加马尔:我没办法把两个答案设为正确答案吗???你和nl-x
两者都是对的。@Sanchit不这么认为。您实际将使用哪种解决方案?有内部联接的还是有子查询的?否则,哪种解决方案是第一个?@Sanchit Its al对,谁的答案被接受并不重要,但我认为nl-x答案更好,而且他比我更快。你真好,马哈茂德·贾马尔: