如何使用 ANSI sql 外连接表 [重复]

Posted

技术标签:

【中文标题】如何使用 ANSI sql 外连接表 [重复]【英文标题】:how to outer-join Tables using ANSI sql [duplicate] 【发布时间】:2017-11-15 13:53:30 【问题描述】:

我正在处理 2 个表。一个包含 657 行符合我的过滤条件,另一个包含 193 条记录。

我使用 Oracle 的“AFAIK”语法成功加入了他们:

select
  ecp.portfolio_acct, ecp.posn_id cost_posn_id, ecp.asset_id 
from MID_COST_POSITION ecp, MID_CASH_POSITION cas
where ecp.portfolio_acct = 10183306
  and ecp.portfolio_acct = cas.portfolio_acct(+)
  and ecp.asset_id       = cas.asset_id(+)
;

但是,我似乎无法使用 ANSI-SQL(或 ISO-sql)复制这些结果:

select
  ecp.portfolio_acct, ecp.posn_id cost_posn_id, ecp.asset_id 
from MID_COST_POSITION ecp
LEFT OUTER JOIN MID_CASH_POSITION cas
  on ecp.portfolio_acct = cas.portfolio_acct
where ecp.asset_id      = cas.asset_id
  and ecp.portfolio_acct = 10183306 
;

我尝试了各种 JOIN 都没有成功。在第一个示例中,我必须外连接 2 个单独的字段,我不知道如何使用 ANSI-SQL 来完成。

感谢任何人提供的任何指导。谢谢!

【问题讨论】:

***.com/questions/4001045/… 的链接给了我所需的答案。 “ON”、“AND”和“WHERE”子句的顺序肯定会产生影响。选择 ecp.portfolio_acct、ecp.posn_id cost_posn_id、ecp.asset_id from MID_COST_POSITION ecp LEFT JOIN MID_CASH_POSITION cas on cas.asset_id = ecp.asset_id 和 ecp.portfolio_acct = cas.portfolio_acct 其中ecp.portfolio_acct = 10183306 按1、3 排序;跨度> 【参考方案1】:
select
  ecp.portfolio_acct, ecp.posn_id cost_posn_id, ecp.asset_id 
from MID_COST_POSITION ecp
LEFT OUTER JOIN MID_CASH_POSITION cas
  on ecp.portfolio_acct = cas.portfolio_acct
and ecp.asset_id      = cas.asset_id
Where ecp.portfolio_acct = 10183306 
;

您将其转换为具有以下 where 条件的内部联接,因为它现在必须在结果集中满足该条件:

ecp.asset_id      = cas.asset_id

【讨论】:

是的,我现在看到了。过滤条件顺序非常重要! 这有助于解释它:wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN

以上是关于如何使用 ANSI sql 外连接表 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL如何正确进行外连接

用sql语句进行多表连接查询,怎么不查出重复数据

连接多个表后如何从sql查询结果中删除重复记录

SQL:完全外连接不起作用[重复]

如何使用外键连接两个数据集以创建新数据集?

需要帮助优化外连接 SQL 查询