MySQL的。从table1中的table2中减去数据

时间:2017-08-10 18:49:46

标签: mysql

简单的问题,但我没有办法去完成它。

Table 1.
ID    Quantity
1     4
2     5
3     2

Table 2
ID    Quantity
2     1
3     2

我希望查询获得以下结果:

Table result
ID    Quantity
1     4
2     4

我一直在寻找与MINUS运算符或NOT IN相关的东西,但问题是我想在同一查询中减去数量。

编辑:表1总是大于表2.表2不能包含表1中没有的id。

我希望这个例子澄清了这个问题。

此致!!

3 个答案:

答案 0 :(得分:0)

听起来像连接的经典用例:

SELECT table1.value - COALESCE(table2.value, 0) AS value
FROM table1
LEFT OUTER JOIN table2
    ON table1.id = table2.id
WHERE table1.value != table2.value
-- insert order by clauses/etc if needed

这将计算table2的值减去table1的值。 You can get a good overview of different joins here。这使用了左连接,该连接仅包含匹配table1table2中的ID的结果,然后使用COALESCE来转换null /非从table2匹配到0

最后一个语句的目的是最终删除等于0的结果,因此不包括(3, 0)结果。

您还可以将此联接用于create a view of the output,这有点像缓存和加速查找等优势。

答案 1 :(得分:0)

使用此SELECT语句:

SELECT T1.ID, T1.Quantity - COALESCE(T2.Quantity, 0) AS Quantity
FROM T1 LEFT JOIN T2 ON T1.ID = T2.ID
ORDER BY T1.ID;

答案 2 :(得分:0)

SELECT table1.value - IFNULL(table2.value, 0) AS value
FROM table1
LEFT JOIN table2
    ON table1.ID = table2.ID
WHERE table1.value > table2.value

引导您完成上述查询。您在此处使用LEFT JOIN来组合两个表。 LEFT JOIN是专门使用的,因为并非所有表1 ID都保证显示在表2中,但您仍希望输出这些结果。您在ON条件下使用该ID,因为这是您匹配表的方式。您需要包含IFNULL语句,因为没有匹配的表2 ID的表1 ID将导致该连接行的NULL表2值。然后,您减去这两个值以获得结果。这里的WHERE子句将删除返回值等于或小于零的行。