【问题标题】:why ON clause used on full outer join? [closed]为什么在完全外连接上使用 ON 子句? [关闭]
【发布时间】:2026-01-29 08:10:02
【问题描述】:

据我了解,FULL OUTER JOINLEFT OUTER JOINRIGHT OUTER JOIN 的组合。在这种情况下,它只是将两个表与所有条目连接起来。请让我知道为什么我们为FULL OUTER JOIN 提供“ON”子句?或解释如何应用 ON 子句或它在查询中有何不同?

例如查询:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID

【问题讨论】:

  • 它定义了在确定任一侧的行匹配时使用的标准。与其他类型的连接相同。为什么会出现混乱?你在考虑交叉加入吗?
  • see the doc hereON is used in all join types except a Cross join
  • 正确..正在考虑交叉连接..谢谢!!!明白了

标签: sql sql-server oracle join


【解决方案1】:

ON联接条件,将用于除交叉联接以外的所有联接类型

全外连接类似这样:

SELECT employee.LastName, employee.DepartmentID,
       department.DepartmentName, department.DepartmentID
FROM employee
INNER JOIN department ON employee.DepartmentID = department.DepartmentID

UNION ALL

SELECT employee.LastName, employee.DepartmentID,
       CAST(NULL AS VARCHAR(20)), CAST(NULL AS INTEGER)
FROM employee
WHERE NOT EXISTS (
    SELECT * FROM department
             WHERE employee.DepartmentID = department.DepartmentID)

UNION ALL

SELECT CAST(NULL AS VARCHAR(20)), CAST(NULL AS INTEGER),
       department.DepartmentName, department.DepartmentID
FROM department
WHERE NOT EXISTS (
    SELECT * FROM employee
             WHERE employee.DepartmentID = department.DepartmentID)

测试数据:

CREATE TABLE department
(
 DepartmentID INT,
 DepartmentName VARCHAR(20)
);

CREATE TABLE employee
(
 LastName VARCHAR(20),
 DepartmentID INT
);

INSERT INTO department VALUES(31, 'Sales');
INSERT INTO department VALUES(33, 'Engineering');
INSERT INTO department VALUES(34, 'Clerical');
INSERT INTO department VALUES(35, 'Marketing');

INSERT INTO employee VALUES('Rafferty', 31);
INSERT INTO employee VALUES('Jones', 33);
INSERT INTO employee VALUES('Heisenberg', 33);
INSERT INTO employee VALUES('Robinson', 34);
INSERT INTO employee VALUES('Smith', 34);
INSERT INTO employee VALUES('John', NULL);

Reference

【讨论】:

    【解决方案2】:

    此图将帮助您了解联接。

    【讨论】:

    • +1 图表是完美的,但它并没有完全满足答案,没有否定。
    【解决方案3】:

    cross join 在两个表之间生成笛卡尔积,返回所有行的所有可能组合。它有 no on 子句,因为您只是将所有内容加入到所有内容中。

    full outer join 是左外连接和右外连接的组合。它返回两个表中与查询的 where 子句匹配的所有行,如果这些行不能满足 on 条件,它会将空值放入未填充的字段中。

    来自@Donnie answer

    【讨论】: