在Oracle SQL中,PRIMARY_FLAG(+)='Y'做什么?

时间:2013-12-10 16:58:48

标签: sql oracle

我正在查询查询中的这一块SQL:

AND CONT_POINT.CONTACT_POINT_TYPE(+) = 'EMAIL' 
AND CONT_POINT.PRIMARY_FLAG(+) = 'Y'
AND ra.cust_trx_type_id = rt.cust_trx_type_id

PRIMARY_FLAG(+) = 'Y'部分是什么?谢谢!

编辑:嗯,我想我找到了一个领先者 - Oracle "(+)" Operator

1 个答案:

答案 0 :(得分:1)

是的,它是旧的(ANSI SQL之前的)外连接运算符。

但是,在这种特殊用法中,值得再提一点。

如果您有查询,例如:

select a.name parent_name, 
       b.name child_name 
  from parent a,
       child b
 where a.id = b.id(+);
然后你将显示所有父母的名字,即使那些没有孩子的名字也是如此。 (这就是(+)运算符所做的。如果父级中的行没有任何子级,则仍会显示这些行,并为child_name指定NULL值。)

现在,如果您想向父母展示,即使是那些没有孩子的父母,但只有女孩子呢?

如果您执行以下操作:

select a.name parent_name,
       b.name child_name
  from parent a,
       child b
 where a.id = b.id(+)
   and b.gender='F';

会有效地使外连接无效。由于任何外连接行对于CHILD中不存在数据的所有行都将为NULL,因此“b.gender ='F'”将通过过滤掉外连接的行来有效地抵消外连接。

所以,如果相反,你会做类似的事情:

select a.name parent_name,
       b.name child_name
  from parent a,
       child b
 where a.id = b.id(+)
   and b.gender(+)='F';

这会给你带来理想的效果。它只显示从PARENT到CHILD连接的行的女性,对于没有孩子的行,它们被过滤掉。

所以,即使你没有显示完整的查询,我的猜测是你外部加入了具有PRIMARY_FLAG列的表,并且这个谓词说,显示PRIMARY_KEY为'Y的所有行由于外部联接到不存在的行,' PRIMARY_KEY为NULL。

希望这很清楚。