我有一个查询,我从两个以上的表中检索数据。我在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
有没有更好的方式来写这个?
答案 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
子句中的连接条件的示例一样。所以你可以让我丢失记录。假设您想要第一个表中的所有记录,即使第二个表中没有相应的记录。您当前的代码只返回第一个表中具有匹配记录的记录。