2017-08-10 88 views
-2

简单的问题,但我没有办法去实现它。MySQL。从table1中减去表1中的数据

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 

我一直在寻找带有负运营商相关的东西,或NOT IN,但事情是我想。减去的数量相同的查询。

编辑:表1总是比表2更大不能包含的ID不存在于表1中

希望例如澄清的问题。

Regards !!

+1

你是如何得到(2,4)行的? – yanman1234

+0

表1.行ID 2 - > Quantity = 5表2. ID 2 - > Quantity 1因此,在表结果中,ID 2是5-1 = 4 – user2635067

+0

请澄清您试图达到的目标;不要让我们从想要的结果中反思你的想法。如果我理解正确,那么您希望从表1的数量中减去每个ID的表2的数量,如果结果为0则不返回任何内容。您可以[编辑问题](https://stackoverflow.com/posts/ 45621446 /编辑)并解释? –

回答

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 

这将计算表2的值减去表1的值。 You can get a good overview of different joins here。这将使用一个左连接,该连接只包括table1table2中匹配的id都匹配的结果,然后使用COALESCEnull /不匹配从表2转换为0

最后一条语句的目的是最终删除等于0的结果,所以这不包括(3, 0)结果。

您也可以使用此连接到create a view of the output,它具有缓存和加速查找等优点。

+0

谢谢流氓,你能解释一点点更多的最后一行吗? #如果需要,插入子句/等。非常感谢你! – user2635067

+0

这是一个意见,表示您需要在声明中加入任何其他逻辑(例如,如果您只需要'id'为'2'的结果)。我使用了错误的注释字符,修正了。 – Rogue

+0

这不会将(1,4)行添加到结果中,因为表2没有ID = 1行并且正在使用INNER JOIN。 – yanman1234

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; 
+0

谢谢Girish007我会检查一下。 – user2635067

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子句将删除返回值等于或小于零的行。

+0

谢谢yanman1234 :)这是有益的 – user2635067