SQL三表连接的两种不同思路

本文分享了一种使用SQL连接表的新方法,通过先将两个必须连接的表进行连接,再使用内连接加入第三个表,这种方法在保持代码逻辑清晰的同时,提高了查询效率。对比了两种方法,一种是将所有表一次性连接,另一种则是逐步连接,后者虽然写法更复杂,但在特定情况下能带来性能提升。

之前写SQL一直都是按照基本的思路
select from 表1 LEFT JOIN where。。。
今天看到别人的SQL ,虽然新方法更复杂,但是确实开阔了思路。
step1
set声明变量
step2

方法一:
SELECT
T1…,
T2…
FROM
(SELECT 列1,列2…
FROM t1 LEFT JOIN t2 on…)AS T1
INNER JION
(SELECT 列1,列2…
FROM t3 .)AS T2
ON T1.x=T2.x
先把两个必须连的表连接,最后一个表没有连接
这样写的原因是T1的SQL(sal_contract oa_contract_apply的SQL)是现成的,不用重新写,所以比方法二会更快。

方法二
SELECT * FROM (
select
t1.
t2.
t3.
from
t1
left jion t1.= t2.
left jion t2.=t3.
where 合同类型是母合同

UNION
select
t1.
t2.
t3.
from
t1
left jion t1.= t2.
left jion t2.=t3.
where 合同类型是子合同
as xiaoheihong

这样看起来还是方法二更简单,但是方法一逻辑更清晰些
就当是开阔一下思路吧,不能总是按部就班的按标准流程走哈哈哈哈哈

这是第一次用inner join。。

<think>嗯,用户想知道如何在SQL Server中使用JOIN语句连接个数据,需要示例教程。首先,我需要回忆一下SQL Server中JOIN的基本用法,尤其是多连接的情况。根据之前的引用资料,特别是引用3中的例子,里面提到了连接的情况,用户使用了INNER JOIN和WHERE两种方式。我应该重点解释使用JOIN ON的方法,因为用户明确提到了JOIN语句。 首先,要确保用户理解连接的基本概念,比如INNER JOIN和LEFT JOIN的区别。然后,需要展示如何逐步连接。可能需要从两个连接开始,逐步扩展到第,这样用户更容易理解结构。 引用3中的例子使用了:STU、COU和HOMEWORKS。用户可能希望看到类似的示例,或者更通用的例子。我应该构造一个通用的示例,比如订单系统中的Customers、Orders和OrderDetails,这样更直观。 另外,要注意连接条件的顺序,以及ON子句的位置。在多个JOIN时,每个JOIN后面跟着对应的ON条件,可能需要嵌套或按顺序连接。例如,先连接两个,再连接,确保每个JOIN都有正确的关联字段。 还要提到性能优化,比如确保连接字段有索引,以及使用别名简化代码。引用5提到了WITH (NOLOCK)的提示,但用户的问题可能不需要这个,不过可以稍微提一下性能注意事项,比如索引的重要性。 用户可能需要了解不同的JOIN类型对结果的影响,比如INNER JOIN只会返回匹配的记录,而LEFT JOIN会包含左的所有记录。所以在示例中应该明确说明使用的是INNER JOIN还是其他类型,并根据情况给出不同的例子。 最后,生成相关问题时,要考虑用户可能的后续疑问,比如性能优化、多连接的其他类型(如RIGHT JOIN、CROSS JOIN),以及如何处理更复杂的连接条件。引用1和2提到了CROSS JOIN和WHERE与JOIN的区别,可以作为相关问题的基础。</think>### SQL Server中JOIN连接的实现方法 在SQL Server中连接的核心思路是**通过主键和外键建立间关联关系**,使用`JOIN ON`语句逐步建立连接。以下是两种典型实现方式: --- #### 方法1:链式JOIN连接(推荐) ```sql SELECT C.CustomerName, O.OrderDate, OD.ProductID, OD.Quantity FROM Customers C INNER JOIN Orders O ON C.CustomerID = O.CustomerID INNER JOIN OrderDetails OD ON O.OrderID = OD.OrderID WHERE C.Country = '中国' ``` - **执行流程**: 1. 先连接`Customers`和`Orders`,通过`CustomerID`建立关联 2. 将结果集再与`OrderDetails`连接,通过`OrderID`关联 3. 最后过滤国家为"中国"的记录[^3] - **性能建议**: - 为`CustomerID`和`OrderID`字段创建索引 - 避免在连接字段上使用函数或类型转换 --- #### 方法2:混合WHERE条件连接 ```sql SELECT C.CustomerName, O.OrderDate, OD.ProductID, OD.Quantity FROM Customers C, Orders O, OrderDetails OD WHERE C.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID AND C.Country = '中国' ``` - **注意点**: - 这种隐式连接方式在逻辑上与JOIN等价,但可读性较差 - 复杂查询时可能影响执行计划优化[^1] --- ### 关键差异对比 | 特性 | JOIN ON语法 | WHERE条件连接 | |--------------------|----------------------|---------------------| | 可读性 | 关系清晰可见 | 关系逻辑混合在条件中 | | 外连接支持 | 明确指定LEFT/RIGHT | 无法实现外连接 | | 执行计划优化 | 更易生成最优计划 | 可能影响优化器判断 | | ANSI标准 | 符合SQL-92标准 | 旧式语法 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值