【发布时间】:2011-03-23 10:49:52
【问题描述】:
对不起,我几乎是一个 SQL 菜鸟。这必须在 MSFT SQL、Oracle 和 Sybase 中工作。在下面的 sn-p 中,我需要在 IJ.PO_id = KL.PO_id 上将 IJ 和 KL 之间的 inner join 更改为 left join,也在 IJ.PO_id = KL.PO_id 上。所以,我相信我必须重新考虑这一点。好吧,隐式连接并不是最易读的,至少在我的同事看来。我想我会同意,直到我发展出自己的品味。抱歉,为了以防万一,我修改了表名和字段名。
/* @IJ_id is an input stored proc patrameter. */
from AB,
CD,
EF,
GH,
IJ,
KL
where
EF.EF_id = IJ.EF_id and
IJ.EF_id = AB.EF_id and
EF.ZY_id = IJ.ZY_id and
IJ.ZY_id = AB.ZY_id and
IJ.IJ_id = AB.IJ_id and
IJ.IJ_id = @IJ_id and
EF.XW_id = GH.GH_id and
AB.VU_code = CD.VU_code and
IJ.TS > 0 and
IJ.RQ = 0 and
EF.RQ = 0 and
AB.RQ = 0 and
IJ.PO_id = KL.PO_id;
现在,我的困难在于 where 子句中发生了很多事情。看起来不像 a.b = c.d 的东西将保留在 where 子句中,但并非所有看起来像 a.b = c.d 的东西看起来都很容易转换为显式连接。困难的部分是理想情况下,邻居之间的条件是-AB+CD、CD+EF、EF+GH、GH+IJ、IJ+KL,但他们现在还没有那么有条理。我可以重新订购一些,但最终我不想忘记我的目标:我希望新查询不会变慢,并且我希望新查询的可读性不会降低。似乎我最好只修改我需要更改的部分,并使其基本保持不变。我不确定我是否可以这样做。
如果您理解我的意图,请提出更好的查询。如果你没有,那么请告诉我如何改进这个问题。谢谢。
【问题讨论】:
-
按照目前的写法,这些都将是 INNER JOIN,而您正在重写为显式 INNER JOIN,因此您可以更改为 LEFT JOIN?
-
你是对的。我只想将其中一个更改为左连接,
IJ+KL: IJ.PO_id = KL.PO_id。所以,我认为将所有其他的重写为显式内部连接会 A) 使我的更改成为可能,B) 使其更具可读性。 -
很高兴看到您正在重写它,因为 t-sql 在任何使用隐式连接的版本中都无法正确处理左连接。
-
这是为什么隐式连接更难维护的完美例子!
-
@HLGEM,我想毫无头绪和不知道那会是什么样子是有好处的:)
标签: tsql refactoring performance left-join inner-join