老SQL? FROM 后的多个表
Old SQL? multiple tables after FROM
我正在尝试重写以下由 Impromptu 部分生成的查询。出于某种原因,我无法理解 FROM 之后的多个 tables 和后面的连接嵌套。我一直使用 "master" table 然后加入任何我需要的东西。即 select 来自,在 x=x 上左连接 (table) 在 x=x 上左连接 (table) 等等。
在这件事上,我和父母等人在一起时遇到了困难。用 "normal" 查询风格写成什么样子?非常感谢!
select
T6."dateofservice"
, getdate(), -20000 - (1 - convert(float(53),-2) / abs(-2)) / 2
, T1."pgrp_specialty"
, T1."pgrp_prov_combo"
, T2."patsex"
, T3."restricted"
, T2."patdob"
, T2."patdecdate"
, T2."acctno"
, T2."patno"
from
"acctdemo_t" T3, "transaction_t" T5,
("patdemo_t" T2
LEFT OUTER JOIN ("provcode_t" T8
LEFT OUTER JOIN "provalt_t" T1 on T8."px" = T1."accesspractice" and T8."provcode" = T1."accessprovidercode") on T2."provcode" = T8."provcode")
LEFT OUTER JOIN "insset_t" T4 on T2."acctno" = T4."acctno" and T2."patno" = T4."patno", "charge_t" T6
LEFT OUTER JOIN "poscode_t" T7 on T6."poscode" = T7."poscode"
where
T2."patsex" <> 'U'
and T7."posid" = '3'
and T6."correction" = 'N'
and T5."txtype" = 'C'
and (T4."defaultset" = 'Y' or
(T4."inssetno" = 0 or T4."inssetno" is null)
and T4."defaultset" is null)
and T6."chgno" = T5."chgno"
and T2."patno" = T6."patno"
and T2."acctno" = T6."acctno"
and T2."acctno" = T3."acctno"
SQL写成多个table,用逗号分隔隐含INNER JOIN
,where子句作为连接子句。例如,
select * from table1 a, table2 b
where a.id = b.id
等同于:
select * from table1 a inner join table2 b on a.id = b.id
因此,在您的情况下,这部分:
from "acctdemo_t" T3
, "transaction_t" T5
表示 acctdemo_t
和 transaction_t
之间的内连接。
还有-第三部分:
("patdemo_t" T2 LEFT OUTER JOIN
("provcode_t" T8 LEFT OUTER JOIN "provalt_t" T1 on T8."px" = T1."accesspractice" and T8."provcode" = T1."accessprovidercode")
on T2."provcode" = T8."provcode")
实际上是一个 table 集合,它带有自己的子句,在这个连接中基本上充当 table 。也与内部连接连接,因为它添加了逗号。
我相信这绝对可以写得更具可读性,并且正在创建的内联 table 集不会对性能有好处,但这完全取决于您拥有的记录数。
我正在尝试重写以下由 Impromptu 部分生成的查询。出于某种原因,我无法理解 FROM 之后的多个 tables 和后面的连接嵌套。我一直使用 "master" table 然后加入任何我需要的东西。即 select 来自,在 x=x 上左连接 (table) 在 x=x 上左连接 (table) 等等。
在这件事上,我和父母等人在一起时遇到了困难。用 "normal" 查询风格写成什么样子?非常感谢!
select
T6."dateofservice"
, getdate(), -20000 - (1 - convert(float(53),-2) / abs(-2)) / 2
, T1."pgrp_specialty"
, T1."pgrp_prov_combo"
, T2."patsex"
, T3."restricted"
, T2."patdob"
, T2."patdecdate"
, T2."acctno"
, T2."patno"
from
"acctdemo_t" T3, "transaction_t" T5,
("patdemo_t" T2
LEFT OUTER JOIN ("provcode_t" T8
LEFT OUTER JOIN "provalt_t" T1 on T8."px" = T1."accesspractice" and T8."provcode" = T1."accessprovidercode") on T2."provcode" = T8."provcode")
LEFT OUTER JOIN "insset_t" T4 on T2."acctno" = T4."acctno" and T2."patno" = T4."patno", "charge_t" T6
LEFT OUTER JOIN "poscode_t" T7 on T6."poscode" = T7."poscode"
where
T2."patsex" <> 'U'
and T7."posid" = '3'
and T6."correction" = 'N'
and T5."txtype" = 'C'
and (T4."defaultset" = 'Y' or
(T4."inssetno" = 0 or T4."inssetno" is null)
and T4."defaultset" is null)
and T6."chgno" = T5."chgno"
and T2."patno" = T6."patno"
and T2."acctno" = T6."acctno"
and T2."acctno" = T3."acctno"
SQL写成多个table,用逗号分隔隐含INNER JOIN
,where子句作为连接子句。例如,
select * from table1 a, table2 b
where a.id = b.id
等同于:
select * from table1 a inner join table2 b on a.id = b.id
因此,在您的情况下,这部分:
from "acctdemo_t" T3
, "transaction_t" T5
表示 acctdemo_t
和 transaction_t
之间的内连接。
还有-第三部分:
("patdemo_t" T2 LEFT OUTER JOIN
("provcode_t" T8 LEFT OUTER JOIN "provalt_t" T1 on T8."px" = T1."accesspractice" and T8."provcode" = T1."accessprovidercode")
on T2."provcode" = T8."provcode")
实际上是一个 table 集合,它带有自己的子句,在这个连接中基本上充当 table 。也与内部连接连接,因为它添加了逗号。
我相信这绝对可以写得更具可读性,并且正在创建的内联 table 集不会对性能有好处,但这完全取决于您拥有的记录数。