Что такое 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.
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
)