我在尝试理解半连接的概念以及它与传统连接的不同之处时遇到了麻烦。我已经尝试了一些文章,但对解释不满意,有人可以帮我理解吗?
答案 0 :(得分:12)
简单的例子。让我们选择使用左外连接的成绩的学生:
SELECT DISTINCT s.id
FROM students s
LEFT JOIN grades g ON g.student_id = s.id
WHERE g.student_id IS NOT NULL
现在与左半连接相同:
SELECT s.id
FROM students s
WHERE EXISTS (SELECT 1 FROM grades g
WHERE g.student_id = s.id)
后者更有效率。
答案 1 :(得分:7)
据我所知,支持SEMIJOIN/ANTISEMI
的SQL方言是U-SQL / Cloudera Impala。
Semijoins是U-SQL根据在另一个行集中包含行的方式过滤行集的方式。其他SQL方言用SELECT * FROM A WHERE A.key IN表示(SELECT B.关键来自B)模式。
更多信息Semi Join and Anti Join Should Have Their Own Syntax in SQL:
“半”意味着我们并没有真正加入右侧,我们只检查连接是否会产生任何给定元组的结果。
-- IN
SELECT *
FROM Employee
WHERE DeptName IN (
SELECT DeptName
FROM Dept
)
-- EXISTS
SELECT *
FROM Employee
WHERE EXISTS (
SELECT 1
FROM Dept
WHERE Employee.DeptName = Dept.DeptName
)
修改强>
支持SEMI / ANTISEMI加入的另一种方言是KQL:
kind = leftsemi (或kind = rightsemi)
返回左侧与右侧匹配的所有记录。结果表仅包含左侧的列。
let t1 = datatable(key:long, value:string)
[1, "a",
2, "b",
3, "c"];
let t2 = datatable(key:long)
[1,3];
t1 | join kind=leftsemi (t2) on key
<强> demo 强>
输出:
key value
1 a
3 c
答案 2 :(得分:-2)
据我所知,半连接是左连接或右连接:
What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?
因此,左(半)连接和“常规”连接之间的区别在于您只检索左表的数据(您的连接条件匹配)。而对于完整(外部)连接(我认为这是传统连接的意思),您可以检索条件匹配的两个表的数据。