sql - 视图的奇数外部连接结构
问题描述
作为软件升级的一部分,我正在从旧数据库导入视图,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 JOIN
andRIGHT OUTER JOIN
在此查询中所做的事情。
我知道sON
下面的多个子句INNER JOIN
是必要的。ON
似乎在从句和OUTER JOIN
s之间进行了某种隐藏或隐含的映射。过去,我无法说出以这种方式编写查询的目的是什么。
有人可以对它的工作原理以及为什么会这样写有一些见解吗?
解决方案
这是允许的。括号更有意义:
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
来表达JOIN
s(有一种情况我碰巧使用了它们)。永远不需要非交错ON
子句——或者至少,我从来没有机会使用它们或认为它们是编写查询的最佳方式。但是,两者都是允许的。
推荐阅读
- google-bigquery - 通过 Google 表格修改 BQ 数据集
- django - Ajax,Django:状态 200 但抛出错误而不是成功
- javascript - React:[object Object] 通过选择/选项值传递
- android - RecyclerView setLayoutManager() 无法解析
- sql - SQL COUNT(column_name) 来自所有列的表名
- django - Django Channels ASGI - AppRegistryNotReady:应用程序尚未加载
- firebase - 添加初始化 firebase_core 后,Flutter App 卡在加载屏幕
- javascript - 使用 Fortify 工具扫描时替代 Eval() 以避免漏洞检测
- html - 有没有办法用 html 和 css 实现材料文本字段?
- ms-access - 删除数据宏后