SQL Вычесть соответствующие элементы в отдельных таблицах - PullRequest
1 голос
/ 16 июня 2020

Итак, у меня есть 2 таблицы, обе имеют ключ «ID продукта», мне нужно вычесть, где они совпадают, например

Table 1
Key    Value
1       70
2       50
3       12
4       5
5       18
Table 2
Key    Value
2       5
3       3
4       1
5       1

, и мне нужен результат

Output
Key    Value
1       70
2       45
3       9
4       4
5       17

я пробовал

Update Table1
Set Table1.Count = Table1.Count - (
Select Table2.Count
From Table2
Where Table2.ID = Table2.ID
);

Но это устанавливает значение Key 1 равным null

Я также пытался поместить соединение перед Where, но это дало мне ошибку:

ORA-01427: однострочный подзапрос возвращает более одной строки ORA-06512: at «SYS.DBMS_ SQL» `

Ответы [ 2 ]

1 голос
/ 16 июня 2020

В вашем сообщении об ошибке указано, что вы используете Oracle, а не MySQL в качестве тега.

Проблемы с вашим запросом:

  • предложение корреляции в suqbuery неверен: Table2.ID = Table2.ID успешно для всех строк в table2 и, следовательно, возвращает более одной строки, следовательно, вы получаете ошибку

  • , вам нужно обработать случай когда подзапрос не возвращает строк, в противном случае значение null распространяется на ваше обновление: coalesce() можно использовать для этого

Учитывайте:

update table1 
set count = count - coalesce(
    (select t2.count from table2 t2 where t2.id = table1.id),
    0
);

Или или:

update table1 
set count = (select t2.count from table2 t2 where t2.id = table1.id)
where exists (select 1 from table2 t2 where t2.id = table1.id)
0 голосов
/ 16 июня 2020

Вы можете использовать LEFT JOIN, включая функцию COALESCE, чтобы обновить несовпадающие записи вместе с предотвращением появления нулевых значений:

UPDATE Table1 t1
   LEFT JOIN Table2 t2 ON t1.Id = t2.Id
    SET t1.Count = Coalesce(t1.Count,0) - Coalesce(t2.Count,0) 

Демо для MySQL Случай

Обновление : кажется, что вопрос помечен тегом Oracle. Затем вы можете использовать такое MERGE Заявление:

MERGE INTO Table1 t1 
USING Table2 t2 
ON (t1.Id = t2.Id)
    WHEN MATCHED THEN
        UPDATE SET t1.Count = Coalesce(t1.Count,0) - Coalesce(t2.Count,0)

Демо для Oracle Case

Coalesce() может быть заменено с Nvl() для Oracle DB.

...