什么是半连接数据库?

时间:2017-02-15 12:39:32

标签: sql database join

我在尝试理解半连接的概念以及它与传统连接的不同之处时遇到了麻烦。我已经尝试了一些文章,但对解释不满意,有人可以帮我理解吗?

3 个答案:

答案 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。

  

SEMIJOIN

     

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?

因此,左(半)连接和“常规”连接之间的区别在于您只检索左表的数据(您的连接条件匹配)。而对于完整(外部)连接(我认为这是传统连接的意思),您可以检索条件匹配的两个表的数据。