什么是数据库中的半结合



我在尝试理解半加入概念及其与常规联接的不同时遇到了麻烦。我已经尝试了一些文章,但对解释不满意,有人可以帮助我理解它吗?

简单示例。让我们使用左外联机选择具有成绩的学生:

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:

内部连接,左联接,右加入和完整加入之间有什么区别?

因此,左(半)联接和"常规"联接之间的差异是您只能检索左表的数据(在联接条件上有匹配)。鉴于完整的(外部)加入(我认为这是您所说的常规加入的意思),而您可以检索两个表匹配的数据的数据。

相关内容

  • 没有找到相关文章

最新更新