如果在另一个表中没有匹配的id作为占位符行,则生成一行



我有2个表。表1在表2中有一个外键factor_id。

表1 -财务数据

factor_id  trans_id  profit(in K) 
1        476         24
2        476         22  
3        476         19
3        515         41

表2 -财务因素

factor_id  model_id  factor_title
1         43        domestic  
2         43        foreign
3         43        3rd party
4         43        licensed

我需要的是表1返回model_id 43和trans_id 476的所有3行,此外还有一个占位符行,因为factor_id 4不存在于表1

预期输出:

factor_id   trans_id   profit(in K)
1         476          24
2         476          22
3         476          19
4         476          0  <---Created output Row that doesn't exist in Table 1

您可以使用OUTER JOIN,LEFTRIGHT。这种类型的连接将返回一个表中的所有记录(from表用于LEFTjoin表用于RIGHT),即使在另一个表中没有匹配,也会在没有匹配的表中引用的所有列返回空值,但在结果中返回。

要返回0或其他值而不是NULL,我们可以使用ISNULL()函数。

下面两个查询是等价的,首先显示RIGHT连接(术语OUTER是可选的,在本示例中省略),因为它匹配您可能已经拥有的FROM语句,LEFT连接示例交换语句中的表。一般来说,FROM表应该是最显著的过滤的表,对于这个有限的例子,两者都不优于另一个。

SELECT ff.factor_id, IsNull(f.trans_id,476) AS trans_id, IsNull(f.profit,0) AS profit
FROM financial_data f 
RIGHT JOIN financial_data ff on ff.factor_id = f.factor_id

变体:

SELECT ff.factor_id, IsNull(f.trans_id,476) AS trans_id, IsNull(f.profit,0) AS profit
FROM financial_factors ff 
LEFT JOIN financial_data f on ff.factor_id = f.factor_id

结果:

<表类>factor_idtrans_id利润tbody><<tr>14762424762234761944760

我想你只是想要left join:

select ff.factor_id, v.trans_id, coalesce(f.profit, 0) as profit
from financial_factors ff cross join
(values (476)) v(trans_id) left join
financial f
on f.factor_id = ff.factor_id and
f.trans_id = v.trans_id;

最新更新