как именно LEFT OUTER JOIN в реляционной алгебре работает, когда нет общего атрибута - PullRequest
1 голос
/ 03 февраля 2012

например, предположим, что у нас есть два отношения

R1 (A, B) R 2 (С, D)

и это таблицы

  A B
 a1 b1 
 a2 b2

 C  D
 c1 d1
 c2 d2

будет ли результат левого внешнего соединения следующей таблицей?

  A   B  C  D 
  a1 b1 c1 d1
  a1 b1 c2 d2
  a2 b2 c1 d1
  a2 b2 c2 d2

у нас нет общих атрибутов, и поэтому я не включаю NULL.

если этот результат правильный, то по сути то же самое с простым соединением и оператором перекрестного соединения я не прав?

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

r1 LEFT JOIN r2 без условия эквивалентно r1 LEFT JOIN r2 ON (Empty)=(Empty).Однако я не думаю, что вы можете выдавать в SQL r1 LEFT JOIN r2 без ON части.

Что вы можете сделать, это выдать r1 NATURAL LEFT JOIN r2 (по крайней мере, в MySQL):

CREATE TABLE R1
( a int
, b int
) ;

INSERT INTO R1
  VALUES
  (1,1) ,
  (2,2) ;


CREATE TABLE R2
( c int
, d int
) ;

INSERT INTO R2
  VALUES
  (3,3) ,
  (4,4) ;

SELECT
      *
FROM 
      R1
  NATURAL LEFT JOIN 
      R2 ;

И результат (правильно) совпадает с NATURAL INNER JOIN и CROSS JOIN:

a b c d
-------
1 1 3 3
1 1 4 4
2 2 3 3
2 2 4 4
1 голос
/ 03 февраля 2012

LEFT OUTER JOIN - это всегда для некоторого общего столбца. Для вашего примера CROSS JOIN является единственным применимым - и он даст вам именно тот результат, который вы предоставили.

Excrept (Глава 5, Реляционная алгебра ) из Ребека М. Риордан: Проектирование систем реляционных баз данных, опубликовано Microsoft Press :

Внешнее соединение возвращает все записи, возвращенные внутренним соединением, плюс все записи из одного или обоих других наборов записей. пропущенные («несопоставленные») значения будут равны нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...