Oracle Semi Join
Semi Join在Oracle 8.0中引入。它提供了执行WHERE EXISTS子查询的有效方法。
Semi Join返回第一个表中每行至少有一个匹配项的一个副本。
Semi Join是使用EXISTS构造编写的。
Oracle Semi Join示例
让我们采用两个表"部门"和"客户"
部门表
CREATE TABLE "DEPARTMENTS"
( "DEPARTMENT_ID" NUMBER(10,0) NOT null ENABLE,
"DEPARTMENT_NAME" VARCHAR2(50) NOT null ENABLE,
CONSTRAint "DEPARTMENTS_PK" PRIMARY KEY ("DEPARTMENT_ID") ENABLE
)
/
客户表
CREATE TABLE "CUSTOMER"
( "CUSTOMER_ID" NUMBER,
"FIRST_NAME" VARCHAR2(4000),
"LAST_NAME" VARCHAR2(4000),
"DEPARTMENT_ID" NUMBER
)
/
执行此查询
SELECT departments.department_id, departments.department_name
FROM departments
WHERE EXISTS
(
SELECT 1
FROM customer
WHERE customer.department_id = departments.department_id
)
ORDER BY departments.department_id;
输出
反联接和Semi Join之间的差异
虽然Semi Join返回第一个表中至少找到一个匹配项的每行的一个副本,但反联接返回每个表的一个副本没有找到匹配项的第一个表中的行。