Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询,从一个表中查找并插入到第二个表中_Mysql_Sql_Sql Update - Fatal编程技术网

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

MySQL查询,从一个表中查找并插入到第二个表中,mysql,sql,sql-update,Mysql,Sql,Sql Update,我正在寻找以下信息: 需要具有以下条件的行:两个表中设备列的公共值和接口列的前三个字符 然后,从表1中匹配上述条件的行,检索指定列的值,并将其存储在表2中匹配上述条件的行的Avgin列中 有人能帮我吗?数据库是MySQL。如果有多个匹配项,则只使用第一个匹配项。 如果没有,将使用null。如果您想要其他内容,请使用ifnull 编辑:添加了ifnull如果有多个匹配项,则仅使用第一个匹配项。 如果没有,将使用null。如果您想要其他内容,请使用ifnull 编辑:添加了ifnull更新和JOIN

我正在寻找以下信息:

需要具有以下条件的行:两个表中设备列的公共值和接口列的前三个字符

然后,从表1中匹配上述条件的行,检索指定列的值,并将其存储在表2中匹配上述条件的行的Avgin列中


有人能帮我吗?数据库是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答案更好,而且他比我更快。你真好,马哈茂德·贾马尔: