我正在尝试将一个库存表中的值更新到另一个库存表中。但是,某些值将被复制为Circle
,因为源表中不存在该库存。我认为NULL
仅查看两个表之间共享的值。我的INNER JOIN
表中的股票比allStocks
多得多,但是divStocks
中有几只股票在divStocks
中不存在。我只想将价格从allStocks
复制到allStocks
,而不用divStocks
覆盖任何价格。
这是我当前的查询:
NULL
答案 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`);