以下是两个查询。我找不到它是如何工作的。
事实上,第一个查询不会返回任何值,而是返回第二个查询 返回几行。
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;
答案 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
join
和my_destalias
{{1}}。
感谢所有回答此问题的人。