Поскольку это оператор, содержащий отношения, то можно предположить, что результат также должен быть отношение, насколько это возможно в SQL т.е. не дублировать столбцы, нет повторяющихся строк, нет нулей и т. д. В качестве примечания обратите внимание, что если атрибуты отношений R
и S
являются общими, то их естественное объединение даст тот же результат, что и их продукт.
Как уже указывалось, если R
и S
имеют некоторые общие атрибуты (одно и то же имя, то же самое), то в SQL произведение таблиц будет создавать повторяющиеся столбцы. Невзирая на идею запроса INFORMATION_SCHEMA
, объединение-релакс не может быть обобщено в SQL. Вместо этого мы должны использовать явные проекции, т. Е.SELECT
предложения с явными атрибутами, по крайней мере некоторые из которых должны быть «точными». Скажем, например, мы имеем R { x, y }
и S { y, z }
с y
будучи общую колонку, затем продукт может быть выражен как:
SELECT DISTINCT R.x, R.y, S.z
FROM R CROSS JOIN S
То есть, проекция всех атрибутов R
и атрибуты S
известно, не являются общими. Существует множество других возможностей, которые приведут к такому же результату, но все они связаны с предварительным знанием задействованных атрибутов, включая любые общие.
Приняв, что проекция должна быть явным, ничто не теряется, выражая естественное соединение, как его тэта присоединиться к эквивалентной ИЭ [INNER] JOIN
с ON
пункта:
SELECT DISTINCT R.x, R.y, S.z
FROM R JOIN S ON R.y = S.y
Кроме того, у нас нет никакой необходимости для SQL ключевого слова CORRESPONDING
(как в UNION CORRESPONDING
). К счастью, все это означает, что мои запросы будут выполняться на моем SQL-продукте по выбору (SQL Server)!
Один подход, я думаю, что намекают J Cooper, является объединением) естественным присоединиться (который может быть пустым множеством), и б) продукт, где естественное соединение является пустое множество:
SELECT R.*, S.z
FROM R JOIN S ON R.y = S.y
UNION
SELECT R.*, S.z
FROM R CROSS JOIN S
WHERE NOT EXISTS (SELECT *
FROM R JOIN S ON R.y = S.y);
Другой подход является продуктом минус симметрическая разность («взаимоисключающие кортежи»), где естественное соединение не пустое множество:
SELECT R.*, S.z
FROM R CROSS JOIN S
EXCEPT
SELECT R.*, S.z
FROM R JOIN S ON R.y <> S.y
WHERE EXISTS (SELECT *
FROM R JOIN S ON R.y = S.y);
Какие СУБД? Какая версия? –
Возможно ли это в SQL? Эти два параметра будут иметь разное количество столбцов. –
@ypercube - это, посмотрите на мои подсказки. почему естественное соединение против кросс-соединения дает разные столбцы? –