首页 > 解决方案 > 视图的奇数外部连接结构

问题描述

作为软件升级的一部分,我正在从旧数据库导入视图,FROM我在工作时看到了这个子句。

FROM 
    t_store_master AS STM 
RIGHT OUTER JOIN 
    dbo.t_shipping AS SHP 
INNER JOIN 
    t_hu_master AS HUM 
INNER JOIN 
    t_stored_item AS STO ON HUM.hu_id = STO.hu_id
      ON SHP.shipment_id = HUM.reserved_for 
      AND SHP.location_id = HUM.location_id 
INNER JOIN 
    dbo.t_carrier AS CAR ON SHP.carrier_code = CAR.carrier_code 
LEFT OUTER JOIN 
    dbo.t_order_detail AS ORD 
INNER JOIN 
    dbo.t_order AS ORM ON ORD.order_number = ORM.order_number
INNER JOIN 
    dbo.t_pick_detail PDL ON ORD.order_number = PDL.order_number
       ON STO.type = PDL.pick_id
       ON STM.store_id = HUM.control_number_2

我的理解是OUTER JOIN需要一个ON子句才能被编译器正确解释。但是,肯定有一些我不知道的极端情况,因为上面的代码返回了良好的数据而不会引发任何错误。

在对 s 的 MSDN 标准进行了一些查看和阅读之后OUTER JOIN,我仍然不知道LEFT OUTER JOINandRIGHT OUTER JOIN在此查询中所做的事情。

我知道sON下面的多个子句INNER JOIN是必要的。ON似乎在从句和OUTER JOINs之间进行了某种隐藏或隐含的映射。过去,我无法说出以这种方式编写查询的目的是什么。

有人可以对它的工作原理以及为什么会这样写有一些见解吗?

标签: sqlsql-serverjoinview

解决方案


这是允许的。括号更有意义:

FROM t_store_master STM RIGHT OUTER JOIN
     (dbo.t_shipping SHP INNER JOIN
      (t_hu_master HUM INNER JOIN
       t_stored_item STO 
       ON HUM.hu_id = STO.hu_id
      )
      ON SHP.shipment_id = HUM.reserved_for AND
         SHP.location_id = HUM.location_id 
     ) INNER JOIN
     (dbo.t_carrier CAR 
      ON SHP.carrier_code = CAR.carrier_code LEFT OUTER JOIN
      ((dbo.t_order_detail ORD INNER JOIN
        dbo.t_order ORM 
        ON ORD.order_number = ORM.order_number
       ) INNER JOIN
       dbo.t_pick_detail PDL
       ON ORD.order_number = PDL.order_number
      )
      ON STO.type = PDL.pick_id
     )
     ON STM.store_id = HUM.control_number_2

也就是说,我建议永远不要编写这样的查询,如果它在生产代码中,请尽快重写查询。至少,添加括号!

从句中几乎不需要括号FROM来表达JOINs(有一种情况我碰巧使用了它们)。永远不需要非交错ON子句——或者至少,我从来没有机会使用它们或认为它们是编写查询的最佳方式。但是,两者都是允许的。


推荐阅读