Что такое semi-join в базе данных?

У меня возникли проблемы, пытаясь понять концепцию полу-соединения и как она отличается от обычного соединения. Я уже пробовал какую-то статью, но не удовлетворен объяснением, может кто-то, пожалуйста, помогите мне понять это?

3 ответов


Как я понимаю, полусоединение-это левое или правое соединение:

в чем разница между внутренним соединением, левым соединением, правым соединением и полным соединением?

таким образом, разница между левым (полу) соединением и "обычным" соединением заключается в том, что вы извлекаете только данные левой таблицы (где у вас есть совпадение по условию соединения). В то время как с полным (внешним) соединением (я думаю, что это то, что вы подразумеваете под обычным соединением), вы получаете данные обеих таблиц, где твое состояние совпадает.


простой пример. Давайте выберем студентов с оценками используя левое внешнее соединение:

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)

последнее гораздо более эффективно.


насколько я знаю диалекты SQL, которые поддерживают SEMIJOIN/ANTISEMI являются U-SQL / Cloudera Impala.

SEMIJOIN:

Semijoins-это способ U-SQL фильтровать набор строк на основе включения его строк в другой набор строк. другие диалекты SQL выражают это с помощью шаблона SELECT * FROM a WHERE A. key IN (SELECT B. key FROM B).

Подробнее Semi Join и Anti Join должны иметь свой собственный синтаксис в В 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
)