MySQL - обновление с внутренним объединением создает нули - PullRequest
3 голосов
/ 06 июня 2019

Я пытаюсь обновить значения из одной таблицы запасов в другую таблицу запасов.Однако некоторые значения копируются как NULL, потому что этот запас не существует в исходной таблице.Я думал, что INNER JOIN смотрел только на значения, которые были разделены между обеими таблицами.Моя таблица allStocks содержит гораздо больше акций, чем divStocks, но в divStocks есть несколько акций, которых нет в allStocks.Я просто хочу скопировать цены с allStocks в divStocks и не перезаписывать цены с NULL.

Это мой текущий запрос:

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

Ответы [ 5 ]

3 голосов
/ 12 июня 2019

Я бы сказал, что самым простым решением было бы добавить 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;
0 голосов
/ 18 июня 2019

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`);
0 голосов
/ 18 июня 2019
UPDATE divStocks ds 
RIGHT JOIN allStocks als ON ds.tickerSymbol = als.tickerSymbol 
SET ds.price = als.price, ds.priceAsOf = als.priceAsOf;
0 голосов
/ 12 июня 2019

Если вы хотите обновить записи из таблицы 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`;
0 голосов
/ 11 июня 2019

Вы можете использовать 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`);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...