join on or 与多次 left join的区别
时间: 2023-10-18 13:32:03 浏览: 298
`JOIN ON OR` 和多次 `LEFT JOIN` 的区别主要在于连接条件和结果集的处理方式。
. `JOIN ON OR`:在 SQL 查询中,可以使用 `OR` 作为连接条件。当使用 `OR` 作为连接条件时,只要满足其中一个条件,就会将两个表中的记录连接在一起。这可能导致结果集中出现重复的记录。例如:
```sql
SELECT a.*, b.*
FROM table_a a
LEFT JOIN table_b b ON a.id = b.id OR a.name = b.name;
```
2. 多次 `LEFT JOIN`:在 SQL 查询中,可以使用多个 `LEFT JOIN` 将多个表连接在一起。每次执行 `LEFT JOIN` 时,都会将当前表与下一个表进行连接。这可能导致结果集中出现重复的记录,并且需要手动去除这些重复记录。例如:
```sql
SELECT a.*, b.*, c.*
FROM table_a a
LEFT JOIN table_b b ON a.id = b.id
LEFT JOIN table_c c ON a.id = c.id;
```
总结:`JOIN ON OR` 和多次 `LEFT JOIN` 的主要区别在于连接条件和结果集的处理方式。使用 `JOIN ON OR` 可以简化查询语句,但可能导致结果集中出现重复记录;而多次 `LEFT JOIN` 需要手动去除重复记录,但可以更灵活地控制连接条件。
相关问题
优化以下sql select b.code empID, b.name empName, a.glbdef1 as position, t4.OrgUnitName as orgUnitName, c2.EHRORGUNITID as ehrOrgunitId from bd_psndoc b left join gbs_psndoc_glbdef19 a on a.pk_psndoc = b.pk_psndoc and a.lastflag='Y' and a.glbdef28='Y' left join hi_psnjob d on d.lastflag = 'Y' and d.ismainjob = 'Y' and d.pk_psndoc = b.pk_psndoc left join view_gbs_psnjob c2 on d.clerkcode = c2.clerkcode left join gbsorgunits t4 on t4.orgunitid = c2.gbsorgunitid LEFT JOIN ( SELECT tt1.empid max(tt.operatordate) AS maxday FROM gbs_appointremove_applopinion tt LEFT JOIN gbs_appointremove_checkemp tt1 ON tt.workOrderNo = tt1.workOrderNo AND (tt.approvalLink = '监督室确认更正材料' OR tt.approvalLink = '监督室反馈查核结果') GROUP BY tt1.empid ) t5 ON b.code = t5.empid
这个SQL语句可以进行如下的优化:
1. 尽量避免使用LEFT JOIN,因为它会返回左表中所有的记录,包括那些在右表中没有匹配的记录,这会导致查询结果集变大,影响查询性能。如果可以确定右表中一定有匹配的记录,可以使用INNER JOIN代替LEFT JOIN,这样可以减少结果集的大小。
2. 尽量避免使用子查询,因为子查询会导致多次查询,影响查询性能。如果可以将子查询转换为JOIN操作,可以显著提高查询性能。
3. 尽量避免使用函数,因为函数会对查询性能产生很大的影响。如果可以用其他方式代替函数,可以提高查询性能。
优化后的SQL语句如下:
```
SELECT b.code AS empID,
b.name AS empName,
a.glbdef1 AS position,
t4.OrgUnitName AS orgUnitName,
c2.EHRORGUNITID AS ehrOrgunitId
FROM bd_psndoc b
LEFT JOIN gbs_psndoc_glbdef19 a ON a.pk_psndoc = b.pk_psndoc
AND a.lastflag='Y'
AND a.glbdef28='Y'
LEFT JOIN hi_psnjob d ON d.lastflag = 'Y'
AND d.ismainjob = 'Y'
AND d.pk_psndoc = b.pk_psndoc
LEFT JOIN view_gbs_psnjob c2 ON d.clerkcode = c2.clerkcode
LEFT JOIN gbsorgunits t4 ON t4.orgunitid = c2.gbsorgunitid
LEFT JOIN (SELECT tt1.empid,
MAX(tt.operatordate) AS maxday
FROM gbs_appointremove_applopinion tt
JOIN gbs_appointremove_checkemp tt1 ON tt.workOrderNo = tt1.workOrderNo
AND (tt.approvalLink = '监督室确认更正材料'
OR tt.approvalLink = '监督室反馈查核结果')
GROUP BY tt1.empid) t5 ON b.code = t5.empid;
```
这个SQL语句中,使用了JOIN代替了子查询,使用了INNER JOIN代替了LEFT JOIN,尽量减少了结果集的大小,提高了查询性能。
left join指定值
### 如何在 SQL 中使用 `LEFT JOIN` 指定连接条件
在 SQL 查询中,`LEFT JOIN` 是一种用于组合来自两个或多个表的数据的方法。当使用 `LEFT JOIN` 时,查询会返回左表中的所有记录以及右表中满足连接条件的匹配记录。如果右表中不存在匹配,则结果集中相应的列将包含 NULL 值。
为了指定连接条件,在 `JOIN` 关键字之后紧跟 `ON` 子句来定义两表之间的关系[^1]:
```sql
SELECT *
FROM student
LEFT OUTER JOIN takes ON student.name = takes.name;
```
此例子展示了如何基于学生姓名(`name`)这一共同字段将 `student` 表与 `takes` 表相连[^2]。需要注意的是,可以不仅仅依据单个字段作为连接条件;也可以通过逻辑运算符(如 AND 或 OR)组合多个字段形成更复杂的多条件连接[^5]。
例如,假设存在另一个名为 `courses` 的课程信息表,并希望找到每位学生的选课情况及其对应的课程名称,即使某些学生尚未选择任何课程也应显示其基本信息。此时可构建如下查询语句:
```sql
SELECT s.ID, s.Name, t.CourseID, c.Title
FROM students AS s
LEFT JOIN takes AS t ON s.ID = t.StudentID
LEFT JOIN courses AS c ON t.CourseID = c.ID;
```
上述代码片段说明了怎样利用两次 `LEFT JOIN` 来实现跨三个表格的信息检索操作。这里不仅指定了每一对相邻表间的具体关联规则,还选择了最终输出的结果集所含有的特定列项[^3]。
阅读全文