Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Нечетен INNER JOIN синтаксис и капсулиране

Скобите не променят семантиката. Позицията на ON клаузата контролира реда на логическата обработка на съединенията.

Първа заявка

SELECT Customer.Name,
       Product.Desc,
       Transaction.Date
FROM   Product
       INNER JOIN Transaction
         ON Transaction.ProductID = Product.ID
       INNER JOIN Customer
         ON Transaction.CustomerID = Customer.ID 

Втора заявка

(Излишните скоби са премахнати)

SELECT Customer.Name,
       Product.Desc,
       Transaction.Date
FROM   Product
       INNER JOIN Transaction
                  INNER JOIN Customer
                    ON Transaction.CustomerID = Customer.ID
         ON Transaction.ProductID = Product.ID 

Така че логично в първия ви пример присъединяването към Transaction, Product се случва първо, след което виртуалната таблица, получена от това, се присъединява към Customer , докато във втория ви пример присъединяването към Transaction, Customer се случва първо, след което виртуалната таблица, получена от това, се присъединява към Product

Това е съвсем логично и тъй като вътрешните съединения са както асоциативни, така и комутативни, това вероятно няма да промени плана за изпълнение (освен ако не добавите OPTION (FORCE ORDER) към заявката), но може да направи за външни съединения.

Това е покрито от Ицик Бен Ган тук но статията има редица неточности, вижте последващо писмо от Lubor Kollar както и.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да архивирате Sql база данни програмно в C#

  2. Microsoft SQL Server 2008 Management Studio - Проблем със свързване/сървър/екземпляр

  3. SQL Server обгръща ли Select...Insert Queries в имплицитна транзакция?

  4. Случайна извадка от голям набор от данни

  5. SQL Server С оператор