我有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,LEFT或RIGHT。这种类型的连接将返回一个表中的所有记录(from表用于LEFT,join表用于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
结果:
我想你只是想要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;