Ответ зависит от того, к каким операторам относится ваша алгебра.Оператор полусоединения был бы наиболее полезным здесь.
Если общий атрибут был назван number
в обоих отношениях, то это было бы полусоединение с последующей проекцией number
.Предполагая, что оператор соединения sem с именем MATCHING
, согласно Учебное пособие D :
( collection MATCHING anotherStack ) { number }
После публикации, атрибут должен быть сначала переименован:
( collection MATCHING ( anotherStack RENAME { anotherNumber AS number } ) { number }
Если стандартный SQL (SQL-92) JOIN
можно считать, грубо говоря, реляционным оператором, то верно, что SQL не имеет полусоединения.Однако он имеет несколько предикатов сравнения, которые можно использовать для написания оператора полусоединения, например MATCH
:
SELECT number
FROM collection
WHERE MATCH (
SELECT *
FROM collection
WHERE collection.number = anotherNumber.anotherStack
);
Однако MATCH
широко не поддерживается в реальных продуктах SQL, поэтому, почемуПолу-соединение обычно пишется с использованием IN (subquery)
или EXISTS (subquery)
(и я подозреваю, что именно поэтому в вашем вопросе вы проверили именованный «подзапрос», т. е. термин «полу-соединение» не очень известен среди практиков SQL).
Другой подход заключается в использовании оператора пересечения, если он доступен.
Что-то вроде (псевдокод):
( collection project number )
intersect
( ( anotherStack rename anotherNumber as number ) project number )
В SQL:
SELECT number
FROM collection
INTERSECT
SELECT anotherNumber
FROM anotherStack;
Это довольно хорошо поддерживается в реальной жизни (SQL Server, Oracle, PostgreSQL и т. Д.но особенно не MySQL).