sql-server - 多个 on 语句如何在单个内部联接中工作?
问题描述
有两个 ON 子句一个接一个,像这样:
select * from foo
left join b on b.ID = foo.pID
left join c
inner join foo as f
ON b.ID = f.pProject
ON c.Name = f.Hostname
这是否意味着所有 3 个表都被连接在一起?
解决方案
这意味着连接是嵌套的,因此 f 和 b 之间的内部连接发生在它们共同外部连接到 c 之前。但是,我认为您可能会转置一些行。这可以用一些缩进和括号重写,以使其更清楚。
select *
from foo
left join b
on b.ID = foo.pID
left join (c
join foo as f
ON c.Name = f.Hostname
)
ON b.ID = f.pProject
您可以将其想象为 JOIN 关键字充当左括号,而 ON 关键字充当嵌套匹配对中的右括号。优先级或范围的顺序是这样的,即嵌套连接在完成嵌套连接之前无法访问封闭连接。因此,您所写的最后两个 ON 语句可能会引发错误,直到它们像我上面所做的那样被转置。
推荐阅读
- java - 单行中的多个后缀和前缀操作
- ios - iOS - 在前台接收 FCM 推送消息
- python - 仅在所有构建成功后才部署
- html - 所有页面上的 CSS @page background-images?
- .net - 如何使用 ASP.NET MVC 将数组作为参数传递到 SQL Server
- javascript - 如何替换 HTML 元素的 data 属性中的值
- python - python3 manage.py runserver 命令没有响应
- php - 无论如何要处理授权令牌不匹配错误
- php - 在自定义 WooCommerce 注册页面上获取多个随机数输出
- android - 此 AsyncTask 类应该是静态的,否则可能会发生泄漏(匿名 android.os.AsyncTask)