查询的替代解决方案 - 在oracle plsql中使用INTERSECT函数

时间:2015-07-13 16:49:02

标签: sql oracle

我正在处理查询。我有两个表,一个是详细信息表,其中没有分组发生,它包括所有值,其他表是行表,其中重要的列从详细表中组合在一起。

我想显示行表中的所有列和详细信息表中的一些列。

我使用以下查询来获取我的记录

SELECT ab.*, 
       cd.phone_number, 
       cd.id 
FROM   xxx_line ab, 
       xxx_detail cd 
WHERE  cd.reference_number = ab.reference_number 
       AND cd.org_id = ab.org_id 
       AND cd.request_id = ab.request_id 
       AND ab.request_id = 13414224 

INTERSECT

SELECT ab.*, 
       cd.phone_number, 
       cd.id 
FROM   xxx_line ab, 
       xxx_detail cd 
WHERE  cd.reference_number = ab.reference_number 
       AND cd.org_id = ab.org_id 
       AND cd.request_id = ab.request_id 
       AND ab.request_id = 13414224   

查询工作正常......

但我想知道有没有其他方法可以通过甚至不使用Intersect来达到相同的效果。

我的目的是找出获得相同输出的所有可能方法。

1 个答案:

答案 0 :(得分:1)

INTERSECT运算符返回每个查询返回的唯一行集。可以使用DISTINCT运算符重写代码,以使含义更清晰:

SELECT DISTINCT
       xxx_line.*, 
       xxx_detail.phone_number, 
       xxx_detail.id 
  FROM xxx_line
  JOIN xxx_detail
    ON xxx_line.reference_number = xxx_detail.reference_number
   AND xxx_line.org_id = xxx_detail.org_id
   AND xxx_line.request_id = xxx_detail.request_id
 WHERE xxx_line.request_id = 13414224

我还使用较新的ANSI连接语法(通过强制连接表和条件彼此靠近而使关系更清晰)替换了旧式连接语法,并删除了无意义的表别名(因为代码复杂性更高)与变量数量直接相关的字符数。)