Что такое полу-соединение в базе данных?

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

+9
источник поделиться
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)

Последнее намного эффективнее.

+9
источник

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

SEMIJOIN:

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

Дополнительная информация Semi Join и Anti Join должны иметь свой собственный синтаксис в 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:

вид = leftsemi (или вид = 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

демонстрация

Выход:

key  value
1    a
3    c
+3
источник

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

В чем разница между INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN?

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

-2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос