我在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';
答案 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更容易阅读。