我在尝试理解半加入概念及其与常规联接的不同时遇到了麻烦。我已经尝试了一些文章,但对解释不满意,有人可以帮助我理解它吗?
简单示例。让我们使用左外联机选择具有成绩的学生:
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)
后者通常更有效(取决于混凝土DBM和查询优化器)。
据我所知,支持SEMIJOIN/ANTISEMI
的SQL方言为U-SQL/Cloudera Impala。
semijoin:
semijoins是u-sql的方式,基于将其行包含在另一个rowset中。其他SQL方言以从where a.Key中的select *(select B.b)图案的钥匙。
更多信息半联接和反连接应该在SQL中具有自己的语法:
" semi"意味着我们没有真正加入右手,我们只检查连接是否会给任何给定的元组产生结果。
-- 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
)
编辑:
另一个支持半/反式加入的方言是 kql :
态从右侧返回所有匹配的记录。结果表仅包含左侧的列。
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
演示
输出:
key value
1 a
3 c
据我了解,半联接是左联接或右JOIN:
内部连接,左联接,右加入和完整加入之间有什么区别?
因此,左(半)联接和"常规"联接之间的差异是您只能检索左表的数据(在联接条件上有匹配)。鉴于完整的(外部)加入(我认为这是您所说的常规加入的意思),而您可以检索两个表匹配的数据的数据。