有人可以解释以下查询在Oracle10g中的工作原理吗?

时间:2011-12-26 13:19:17

标签: sql oracle join oracle10g left-join

  • 以下是两个查询。我找不到它是如何工作的。

  • 事实上,第一个查询不会返回任何值,而是返回第二个查询 返回几行。

   select nvl(cdm.dest_id, s.dest_id)
          from my_approval s
          left join my_alias c
          join my_destalias cdm
            on c.cust_id = 73 on cdm.alias_id = c.alias_id
           and cdm.alias_id = s.dest_id
           and s.type = 1;

   select nvl(cdm.dest_id, s.dest_id)
          from my_approval s
          left join my_alias c
          join my_destalias cdm
            on c.cust_id = 73 on cdm.alias_id = c.alias_id
           and cdm.alias_id = s.dest_id
           and s.type = 1;

2 个答案:

答案 0 :(得分:2)

首先,这两个查询看起来像是在尝试完成同样的事情。第一个不应该执行,因为JOIN不能有两个ON子句。第二个查询看起来就像第一个查询一样,除了违规的ON子句已被移动到正确的位置。

至于它是如何工作的,这个查询将从“my_approval”表中选择行。它将显示“my_destalias”表中的dest_id。但是,如果该值为NULL,则它将显示“my_approval”中的dest_id。

只有在“my_destalias”表中存在匹配的行时才会返回行(基于alias_id与dest_id和“my_alias”中的alias_id匹配),因为普通的“JOIN”关键字指定了相等的连接(aka内部联接)。应该注意,只有当my_destalias.alias_id等于BOTH my_approval.dest_id AND my_alias.alias_id时,才会返回此查询中的行。

如果没有匹配项(cust_id = 73),指定给“my_alias”表的LEFT(外部)JOIN仍应返回数据。当然,你的内部JOIN依赖于从该表返回的匹配(cdm.alias_id = c.alias_id)。我认为“c.cust_id = 73”应该是WHERE子句的一部分,而应该在LEFT JOIN中使用下一个JOIN条件之一。

基本上,您的ON子句会使您的查询短路并限制您的结果。如果不知道(确切地)你想要完成的事情(或你的表格看起来像什么),试试这样的东西:

SELECT NVL(cdm.dest_id, s.dest_id)
FROM my_approval s
INNER JOIN my_alias c ON c.alias_id = s.dest_id
INNER JOIN  my_destalias cdm ON cdm.alias_id = s.dest_id
WHERE s.type = 1
AND c.cust_id = 73;

这将从您的ON子句和WHERE子句中获取所有文字值。根据您的帖子,您尝试返回cdm.alias_id等于c.alias_id和s.dest_id的行。我已将这些条件放在您的ON子句中。根据这三个表的相互依赖程度,我选择了两个INNER JOIN(没有LEFT JOIN)。

答案 1 :(得分:0)

回答我的问题......

第一次查询

 select nvl(cdm.dest_id, s.dest_id)
          from my_approval s
          left join my_alias c
          join my_destalias cdm
            on c.cust_id = 73 on cdm.alias_id = c.alias_id
           and cdm.alias_id = s.dest_id
           and s.type = 1;

它的工作方式与左连接一样,连接条件c.cust_id = 73的工作方式类似于左连接,但只有找到匹配的记录才会返回行。

第二次查询

select nvl(cdm.dest_id, s.dest_id)
      from my_approval s
      left join my_alias c
        on c.cust_id = 73
      join my_destalias cdm
        on cdm.alias_id = c.alias_id
       and cdm.alias_id = s.dest_id
       and s.type = 1;

我猜这很简单。它基于连接条件工作 (即)left join my_alias joinmy_destalias {{1}}。 感谢所有回答此问题的人。