加入Oracle的操作

时间:2014-08-22 12:21:48

标签: oracle join

我在oracle中加入多个表时遇到了一些问题。 以下是表格结构:

TName : custac
acno - FK (acno custacdetails)
acbal
bid

Tname : custacdetails
custid - FK (custid custdetails)
acno - PK
actype

Tname : custdetails
custid - PK
fname
lname

Tname : branchdetails 
bid
bname

我想查看所有客户acno,acbal,branchname,fname,lname,其custid为11111,actype为'SA'

我正在使用此查询,但结果错误

select a.acno,c.fname,c.lname,b.bname,a.acbal 
from branch_details b,
     custac a,
     custacdetails d,
     custdetails c 
where c.custid=11111 
  and a.acno=d.acno  
  and a.branchid=b.bid 
  and actype='SA';

1 个答案:

答案 0 :(得分:0)

根据Tony891206的说法,您正在做笛卡尔产品。为避免这种情况,您需要告诉如何将两个表连接在一起。

d.custid = c.custid

如下:

select a.acno,c.fname,c.lname,b.bname,a.acbal 
    from branch_details b,
         custac a,
         custacdetails d,
         custdetails c 
    where d.custid = c.custid
      and c.custid=11111 
      and a.acno=d.acno  
      and a.branchid=b.bid 
      and actype='SA';

所有功劳归于 Tony891206

正如a_horse_with_no_name所述:

  

使用显式JOIN运算符的另一个好例子比where子句中的(过时的)隐式连接更好:你不能忘记连接条件。

所以正确的查询应该写成如下。

select a.acno, c.fname, c.lname, b.bname, a.acbal
    from     branch_details b
        join custac a        on a.bid    = b.bid
        join custacdetails d on d.acno   = a.acno
        join custdetails c   on c.custid = d.custid
    where   c.custid = 11111
        and d.actype = 'SA'

这最后一个查询使表格之间的关系明显,并允许where子句中的空间仅指定过滤条件。

如果您想了解有关SQL语法的更多信息,请访问以下内容:

简而言之,您可能有更好的机会使用{strong> SQL-89 上的SQL-92联接语法自行解决问题,因为您没有别的选择。在编写连接子句时,问自己如何将表连接在一起。

除此之外,有人说使用SQL-92语法的性能略有改善,我个人对此表示怀疑。此外,我传播SQL-92连接语法,因为它比SQL-89更容易阅读。