如果我在查询中不使用加入关键字怎么办?

时间:2013-11-07 18:34:10

标签: sql performance db2

我有一个查询,我从两个以上的表中检索数据。我在where子句中使用过滤条件,但没有使用任何连接关键字

select
    d.proc_code,
    d.dos,
    s.svc_type
from 
    claim_detail d, h_claim_hdr hh, car_svc s 
where 
    d.bu_id="$inp_bu_id" 
and
    hh.bu_id="$inp_bu_id" 
and 
    s.bu_id="$inp_bu_id" 
and 
    d.audit_nbr="$inp_audit_nbr" 
and 
    hh.audit_nbr="$inp_audit_nbr"
and 
    d.audit_nbr=hh.audit_nbr 
and 
    s.car_svc_nbr=hh.aut_nbr 

有没有更好的方式来写这个?

4 个答案:

答案 0 :(得分:4)

虽然您没有使用JOIN关键字,但您的查询确实执行了JOIN

编写查询的更“现代”的方式(即符合ANSI SQL标准的方法)如下:

select
    d.proc_code,
    d.dos,
    s.svc_type
from 
    claim_detail d
join
    h_claim_hdr hh on d.audit_nbr=hh.audit_nbr 
join
    car_svc s on s.car_svc_nbr=hh.aut_nbr
where 
    d.bu_id="$inp_bu_id" 
and
    hh.bu_id="$inp_bu_id" 
and 
    s.bu_id="$inp_bu_id" 
and 
    d.audit_nbr="$inp_audit_nbr" 
and 
    hh.audit_nbr="$inp_audit_nbr"

请注意,这只是一种现代语法。它表达相同的查询,不会影响性能。

请注意,为了使行显示在此查询的输出中,相应的行必须存在于所有三个查询中(即它是内部联接)。如果您想要返回claim_detail但不存在h_claim_hdr和/或car_svc的行,请改用左外连接。

答案 1 :(得分:0)

from子句中的逗号与cross join基本相同。你真的不想使用cross join,除非你真的知道你在做什么。

正确的连接语法有几个优点。其中最重要的是能够在数据库之间轻松兼容地表达其他类型的连接。

大多数人可能会发现此版本更易于遵循和维护:

select d.proc_code, d.dos, s.svc_type
from  claim_detail d join
      h_claim_hdr hh
      on d.bu_id = hh.bu_id and d.audit_nbr = hh.audit_nbr
      car_svc s 
      on d.bu_id = s.bu_id and s.car_svc_nbr = hh.aut_nbr
where d.bu_id = "$inp_bu_id" 
      d.audit_nbr = "$inp_audit_nbr";

答案 2 :(得分:0)

使用WHERE子句而不是JOIN关键字实际上是用于进行连接的不同语法。我相信它被称为 Theta 语法,其中使用JOIN子句称为ANSI语法。

我认为ANSI语法几乎是普遍推荐的,有些数据库需要外部JOIN的ANSI语法。

答案 3 :(得分:-1)

如果您不使用JOIN,则它将是隐式内部联接。与您的WHERE子句中的连接条件的示例一样。所以你可以让我丢失记录。假设您想要第一个表中的所有记录,即使第二个表中没有相应的记录。您当前的代码只返回第一个表中具有匹配记录的记录。

Joins