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

Каква е разликата в тези две заявки като получаване на два различни резултата?

Наистина няма значение, когато правите това във INNER JOIN.

Въпреки това, когато използвате LEFT или RIGHT JOIN, това прави има значение дали ще поставите допълнителния филтър в JOIN или в клаузата WHERE.

Когато поставите филтъра в клаузата WHERE, SQL Server първо извършва присъединяването и след това напълно филтрира редовете, в които филтърът не пасва.
--> това ще намали броя на върнатите редове

Когато поставите филтъра в JOIN, SQL Server извършва филтрирането по време на присъединяването, но само на таблицата, в която сте поставили филтъра.
Все още получавате всички редове от другите таблици, но само те имат данните от филтрираната таблица, където се побира филтърът.
--> това няма да намали броя на редовете, но колоните с данни от таблицата с филтри ще бъдат празни в повече редове

Трудно е за обяснение...за да стане по-ясно, ето един пример:

Вземете примерните данни от Отговорът на RedFilter :

CREATE TABLE [dbo].[t1](
    [ID] [int] NULL,
    [StatusID] [int] NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[t2](
    [ID] [int] NULL
) ON [PRIMARY]
INSERT INTO t1 (ID, StatusID) VALUES (1, 10)
INSERT INTO t1 (ID, StatusID) VALUES (2, 11)
INSERT INTO t1 (ID, StatusID) VALUES (3, 12)
INSERT INTO t1 (ID, StatusID) VALUES (4, 12)
INSERT INTO t2 (ID) VALUES (1)
INSERT INTO t2 (ID) VALUES (3)
INSERT INTO t2 (ID) VALUES (5)

...и изпълнете следните заявки за него:

/* this returns four rows, but only two will have data 
from the second table in the second column */
SELECT t1.ID, t2.ID
FROM t1 
LEFT JOIN t2 ON t1.Id = t2.Id 

/* this returns only one row: the one where t2.ID = 1 */
SELECT t1.ID, t2.ID
FROM t1 
LEFT JOIN t2 ON t1.Id = t2.Id 
WHERE t2.ID = 1 

/* this returns four rows as in the first query, but only one 
row will have data in the second column: the one where t2.ID = 1 */
SELECT t1.ID, t2.ID
FROM t1 
LEFT JOIN t2 ON t1.Id = t2.Id 
AND t2.ID = 1 

Обърнете внимание на различните резултати, както е посочено в коментарите.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. изчислете количеството на запасите при затваряне, цената и стойността по FIFO

  2. Преглед на компресията на данни в SQL Server

  3. Как да използвате ВСИЧКИ логически оператор в SQL Server - SQL Server / TSQL урок, част 126

  4. Как да проверя дали база данни и таблици съществуват в sql сървър в vb .net проект?

  5. Как да направите изтриване на преминаваща заявка в SQL Server