MySQL-使用内部联接更新将创建空值

时间:2019-06-06 03:41:12

标签: mysql inner-join

我正在尝试将一个库存表中的值更新到另一个库存表中。但是,某些值将被复制为Circle,因为源表中不存在该库存。我认为NULL仅查看两个表之间共享的值。我的INNER JOIN表中的股票比allStocks多得多,但是divStocks中有几只股票在divStocks中不存在。我只想将价格从allStocks复制到allStocks,而不用divStocks覆盖任何价格。

这是我当前的查询:

NULL

5 个答案:

答案 0 :(得分:3)

我想说,最简单的解决方案是在查询中添加WHERE,以专门排除allStocks表中没有价格的行。与使用RIGHT JOIN之类的情况(这很不常见)相比,以这种方式这样做可以增加查询的可读性。

UPDATE `divStocks` ds 
INNER JOIN `allStocks` als ON `ds`.`tickerSymbol` = `als`.`tickerSymbol` 
SET `ds`.`price` = `als`.`price`, `ds`.`priceAsOf` = `als`.`priceAsOf`
WHERE `als`.`price` IS NOT NULL;

答案 1 :(得分:0)

您可以使用COALESCE处理allStocks中的值可为空的情况。

UPDATE `divStocks` ds 
INNER JOIN `allStocks` als ON `ds`.`tickerSymbol` = `als`.`tickerSymbol` 
SET `ds`.`price` = COALESCE(`als`.`price`,`ds`.`price`)
   ,`ds`.`priceAsOf` = COALESCE(`als`.`priceAsOf`,`ds`.`priceAsOf`);

答案 2 :(得分:0)

如果要更新divStocks表中仅存在于allStocks表中的记录,则应使用RIGHT JOIN而不是INNER JOIN。例如:

UPDATE `divStocks` ds 
RIGHT JOIN `allStocks` als ON `ds`.`tickerSymbol` = `als`.`tickerSymbol` 
SET `ds`.`price` = `als`.`price`, `ds`.`priceAsOf` = `als`.`priceAsOf`;

答案 3 :(得分:0)

UPDATE divStocks ds 
RIGHT JOIN allStocks als ON ds.tickerSymbol = als.tickerSymbol 
SET ds.price = als.price, ds.priceAsOf = als.priceAsOf;

答案 4 :(得分:0)

IFNULL?那是如果您要保留为内部联接

UPDATE `divStocks` ds 
INNER JOIN `allStocks` als ON`ds`.`tickerSymbol` = `als`.`tickerSymbol`
SET `ds`.`price` = IFNULL(`als`.`price`, `ds`.`priceAsOf`), 
`ds`.`priceAsOf` = IFNULL(`als`.`priceAsOf`, `ds`.`priceAsOf`);