Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sự khác biệt trong hai truy vấn này là gì khi nhận được hai tập kết quả khác nhau?

Nó thực sự không có gì khác biệt khi bạn làm điều này trong INNER JOIN.

Tuy nhiên, khi bạn sử dụng LEFT hoặc RIGHT JOIN, nó không tạo sự khác biệt cho dù bạn đặt bộ lọc bổ sung vào JOIN hay vào mệnh đề WHERE.

Khi bạn đặt bộ lọc vào mệnh đề WHERE, SQL Server thực hiện tham gia trước, sau đó hoàn toàn lọc ra các hàng mà bộ lọc không phù hợp.
-> điều này sẽ làm giảm số hàng được trả về

Khi bạn đặt bộ lọc vào JOIN, SQL Server sẽ thực hiện lọc trong quá trình kết hợp, nhưng chỉ trên bảng mà bạn đặt bộ lọc.
Bạn vẫn nhận được tất cả các hàng từ các bảng khác, nhưng chỉ những hàng có dữ liệu từ bảng được lọc nơi bộ lọc phù hợp.
-> điều này sẽ không làm giảm số hàng, nhưng các cột có dữ liệu từ bảng lọc sẽ trống ở nhiều hàng hơn

Thật khó để giải thích ... để làm rõ hơn, đây là một ví dụ:

Lấy dữ liệu mẫu từ Câu trả lời của 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)

... và chạy các truy vấn sau trên đó:

/* 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 

Lưu ý các kết quả khác nhau như được chỉ ra trong các nhận xét.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giá trị trả về từ thi hành (@sql)

  2. Loại SQL chính xác để lưu trữ .Net Timespan có giá trị> 24:00:00 là gì?

  3. Trong tsql, một câu lệnh Chèn với một câu lệnh Chọn có an toàn về mặt đồng thời không?

  4. Làm cách nào để có được Chèn id trong MSSQL trong PHP?

  5. Lỗi khi cố gắng Chọn x hàng từ DB2 (V4R5M0) qua máy chủ được liên kết máy chủ sql bằng cách sử dụng OPENQUERY