在sql oracle中加入3个表

时间:2014-11-04 10:20:12

标签: sql oracle

我知道这很简单,但我是新手,并且不知道如何编写此查询。我有3张桌子:rekon,流量和笔记。

rekon:

no    sex
a     F
b     F
c     M
d     F
e     M

流:

 no   notes_no
 a    PX
 a    SX
 a    
 a    DX
 b    MX
 b    CX
 c    
 c    PX
 d    LX
 d    WX

注释:

 notes_no  no  
 AX        a
 BX        f
 CX        g
 DX        a
 EX        c 
 FX        c
 GX        g
 HX        b
 PX        a
 SX        a

我想列出不属于流量的笔记中的所有条目,仅针对来自rekon的女性客户。所以结果应该是

no   sex   notes_no
a    F     AX
b    F     HX

我尝试使用声明

notes.notes_no not in (select distinct notes_no from flows)

但是我需要很多行,oracle在计算它时会遇到问题。

提前谢谢。

2 个答案:

答案 0 :(得分:0)

select N.*
from rekon R
    join notes N
        on N.no = R.no
where R.sex = 'F'
    and not exists (
        select 1
        from flows F
        where F.notes_no = N.notes_no
    )
;

根据您的表间引用关系的定义,查询可能略有不同,因此exists谓词也可以读取

    and not exists (
        select 1
        from flows F
        where F.no = N.no
            and F.notes_no = N.notes_no
    )

如果您的Oracle在合理的时间内查询数据时遇到问题,那么您可能会

  1. 缺少在您的表上计算的统计数据(...因此Oracle选择了错误的执行计划)
  2. 组织严密的表(...所以Oracle做了不必要的无用工作)
  3. 配置错误的Oracle服务器(...因此在散列连接期间会遇到困难)
  4. 服务器marchine太慢

答案 1 :(得分:0)

尝试此查询:

SELECT notes.* FROM notes
INNER JOIN rekon ON rekon.no = notes.no
LEFT JOIN flows ON flows.no = notes.no
WHERE flows.no IS NULL and sex = 'F'