2012-02-20 3 views
1

Расслабиться присоединиться оператор определяется как:Как написать выражение relax-join без использования if-else?

если естественное соединение из R и S отношений не пусто, то возвращают результат этого соединения; в противном случае возвращает декартово произведение R и S.

Проблема заключается в том, чтобы написать реляционную алгебру и SQL, которые возвращают Релакс-соединение двух отношений, но не использовать IF-THEN-ELSE.

+0

Какие СУБД? Какая версия? –

+0

Возможно ли это в SQL? Эти два параметра будут иметь разное количество столбцов. –

+0

@ypercube - это, посмотрите на мои подсказки. почему естественное соединение против кросс-соединения дает разные столбцы? –

ответ

1

Поскольку это помечено как домашнее задание, я предполагаю, что я должен только давать указания.

Вот некоторые вещи, чтобы рассмотреть следующие вопросы:

  1. Объединение позволит объединить результаты двух запросов в & B. Это не имеет значения, если A, B или оба содержат записи или нет.

  2. Перекрестное соединение и естественное соединение образуют одинаковые столбцы результатов. ОБНОВЛЕНИЕЭто не относится к MYSQL, как указал @ypercube. Вы можете написать свой sql, чтобы они возвращали одни и те же столбцы, и поэтому могли использовать оба в объединении. Это может работать или не работать для вас.

  3. Учитывая ваш сценарий, если вы когда-либо собираетесь возвращать записи, перекрестное соединение всегда будет производить записи. Естественное соединение может или не может.

Я надеюсь, что это не слишком большой намек, трудно судить, слишком ли я обнаруживаю слишком много или недостаточно. сообщите нам, когда вы это выясните!

UPDATE

Я не знал, что после й количества времени, мы должны были опубликовать фактический ответ, но вот псевдо-запрос я намекал:

SELECT * 
FROM R 
CROSS JOIN S 
WHERE NOT EXISTS (
    SELECT * 
    FROM R 
    NATURAL JOIN S 
) 

UNION 

SELECT * 
FROM R 
NATURAL JOIN S 
+0

Спасибо, Купер. Я понял. Поскольку AxB всегда дает результат, который может быть равен или не равен результату A join B. Просто путем объединения (AxB - A join B) и A join B мы могли бы решить проблему в обоих сценариях. – user1219940

+0

@ user1219940 - не совсем, 'AxB - соединение B', особенно минус' -', не даст вам желаемых результатов. В случае, если 'A join B' производит записи, вы в итоге получаете записи из обоих запросов. В основном одно условие должно быть выполнено, если вы собираетесь возвращать записи из 'AxB' ... –

+0

Должен сказать, что за 30 лет работы с тысячами баз данных я никогда не делал этого. Обычно использование естественного соединения - это ужасный период идеи (и несколько баз данных этого не позволяют). Поэтому не ставьте слишком много усилий на изучение этого. – HLGEM

0

SQL :

R1 = A equi_join B 
R2 = A X B 

R1 
U 
R2 not exists R1 

Это ответ для этого.

Поскольку домашнее задание срок закончится:

R1 = A equi_join B 
R2 = A X B 

R3 = R2.* (R1 X R2) 
R4 = R2 - R3 

return (R1 U R4) 
+0

Я внесла некоторые изменения в этот ответ, пожалуйста, проверьте их дважды. –

1

Поскольку это оператор, содержащий отношения, то можно предположить, что результат также должен быть отношение, насколько это возможно в 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); 
Смежные вопросы