SQL跨表列值逐行减法实现及自动生成列/表方法咨询
刚接触SQL碰到这种关联计算的问题很正常,我来帮你捋清楚~
首先得说你之前的语句为什么会失败:当你写(SELECT amount FROM table1)这种子查询时,如果表中有多行数据,这个子查询会返回多个值,SQL根本没办法直接用两个多值集合做减法——它完全不知道Table1里的哪一行应该对应Table2里的哪一行!所以核心是要先通过两个表共有的id字段,把行一一对应起来,才能做逐行的减法运算。
1. 逐行计算差值(生成额外列展示)
我们可以用JOIN语句关联两个表中id相同的记录,然后直接在SELECT里计算差值,还能把原表的amount也列出来方便核对:
-- 只保留两个表都存在相同id的记录 SELECT t1.id, t1.amount AS table1_amount, t2.amount AS table2_amount, t1.amount - t2.amount AS difference FROM Table1 t1 INNER JOIN Table2 t2 ON t1.id = t2.id;
如果有些id只在其中一个表存在(比如Table1有某个id但Table2没有),你想保留这些记录,可以用LEFT JOIN,还能用COALESCE把NULL值转成0避免计算出错:
-- 保留Table1所有记录,Table2无对应id时用0代替 SELECT t1.id, t1.amount AS table1_amount, COALESCE(t2.amount, 0) AS table2_amount, t1.amount - COALESCE(t2.amount, 0) AS difference FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.id = t2.id;
2. 生成新表或视图保存差值
SQL当然支持!你有两种常用方案:
方案一:创建物理表(永久存储差值)
用CREATE TABLE ... AS SELECT语句,把查询结果直接生成一个新的物理表:
CREATE TABLE AmountDifferences AS SELECT t1.id, t1.amount - t2.amount AS difference FROM Table1 t1 INNER JOIN Table2 t2 ON t1.id = t2.id;
之后你就可以像查询普通表一样操作AmountDifferences了。
方案二:创建视图(实时同步原表数据)
如果不想存储冗余数据,而是想实时看到最新的差值,可以创建视图(虚拟表):
CREATE VIEW vw_AmountDifferences AS SELECT t1.id, t1.amount AS table1_amount, t2.amount AS table2_amount, t1.amount - t2.amount AS difference FROM Table1 t1 INNER JOIN Table2 t2 ON t1.id = t2.id;
查询视图的方式和普通表一样:SELECT * FROM vw_AmountDifferences;,视图里的数据会自动随Table1和Table2的更新而变化。
内容的提问来源于stack exchange,提问作者awang
相关产品推荐
相关产品推荐

