0

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

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

4 回答 4

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左外连接。

于 2013-11-07T18:39:50.823 回答
0

使用 WHERE 子句而不是 JOIN 关键字本质上是一种不同的连接语法。我相信它被称为Theta语法,其中使用 JOIN 子句称为 ANSI 语法。

我相信 ANSI 语法几乎是普遍推荐的,并且一些数据库要求外部 JOIN 的 ANSI 语法。

于 2013-11-07T18:47:06.463 回答
0

子句中的逗号from本质上与 a 相同cross join。你真的不想使用 a 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";
于 2013-11-07T18:45:46.700 回答
-1

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

加入

于 2013-11-07T18:38:28.030 回答