Dar*_*dow 18 sql database join
我在尝试理解半连接的概念以及它与传统连接的不同之处时遇到了麻烦.我已经尝试了一些文章,但对解释不满意,请有人帮我理解一下吗?
Iur*_*Ant 21
简单的例子.让我们选择使用左外连接的成绩的学生:
SELECT DISTINCT s.id
FROM students s
LEFT JOIN grades g ON g.student_id = s.id
WHERE g.student_id IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
现在与左半连接相同:
SELECT s.id
FROM students s
WHERE EXISTS (SELECT 1 FROM grades g
WHERE g.student_id = s.id)
Run Code Online (Sandbox Code Playgroud)
后者效率更高.
据我所知,支持的SQL方言SEMIJOIN/ANTISEMI是U-SQL / Cloudera Impala。
半联接是U-SQL基于另一个行集中包含行的方式来过滤行集的方法。其他SQL方言使用SELECT * FROM A WHERE A.key IN(SELECT B.key FROM B)模式来表达这一点。
更多信息半联接和反联接在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
)
Run Code Online (Sandbox Code Playgroud)
编辑:
支持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
Run Code Online (Sandbox Code Playgroud)
输出:
key value
1 a
3 c
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21239 次 |
| 最近记录: |