loading..
Русский    English
21:14
листать

Явные операции соединения стр. 4

Ассоциативность и коммутативность соединений

Внутреннее и полное внешнее соединения являются как коммутативными, так и ассоциативными, т.е. для них справедливо следующее:

  1. A [FULL | INNER] JOIN B = B [FULL | INNER] JOIN A

и

  1. (A [FULL | INNER] JOIN B) [FULL | INNER] JOIN С =
  2. A [FULL | INNER] JOIN (B [FULL | INNER] JOIN С)

Очевидно, что левое/правое соединения не коммутативны, т.к.

  1. A LEFT JOIN B = B RIGHT JOIN A

но ассоциативны, например:

  1. (A LEFT JOIN B) LEFT JOIN C = A LEFT JOIN (B LEFT JOIN C)

С практической точки зрения ассоциативность означает, что мы можем не расставлять скобки, определяющие прядок выполнения соединений.

Однако закон ассоциативности, справедливый для однотипных соединений, нарушается, если в одном запросе используются соединения разных типов. Покажем это на примере.

Консоль
Выполнить
  1. WITH a(a_id) AS
  2. (SELECT * FROM (VALUES('1'),('2'),('3')) x(y)),
  3. b(b_id) AS
  4. (SELECT * FROM (VALUES('1'),('2'),('4')) x(y)),
  5. c(c_id) AS
  6. (SELECT * FROM (VALUES('5'),('2'),('3')) x(y))
  7. SELECT a_id, b_id, c_id  FROM (a LEFT JOIN b ON a_id=b_id) INNER JOIN c ON b_id=c_id
  8. UNION ALL
  9. SELECT '','',''
  10. UNION ALL
  11. SELECT a_id, b_id, c_id  FROM  a LEFT JOIN (b INNER JOIN c ON b_id=c_id) ON a_id=b_id;

a_id    b_id    c_id
2    2    2
           
1    NULL    NULL
2    2    2
3    NULL    NULL

Результаты двух запросов отделены друг от друга пробельной строкой для удобства.

Заметим, что при отсутствии скобок мы получим результат, совпадающий с результатом первого запроса, поскольку соединения будут выполняться в том порядке, в каком они записаны.

Bookmark and Share
Страницы: 1 2 3 4
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
месяц назад
https://exchangesumo.com/obmen/to/SVBRUB/
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.