2013-05-15 14 views
5

Vì vậy, tôi biết đó là một phương pháp lập trình tốt để thêm các điều kiện lọc trong mệnh đề WHERE của truy vấn để giảm thiểu số lượng hàng được trả về trong các kết nối. quyết định xem chúng ta có nên thêm bộ lọc vào WHERE thay vì FROM không? Ví dụ:Thêm bộ lọc vào WHERE so với FROM

SELECT a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM TblA a INNER JOIN TblB b 
On a.ColA = b.ColD 
AND a.ColA = 'X' 
AND a.ColB = 'Y' 
WHERE b.ColD = 'ABC' 

Trong truy vấn này, nếu tôi thêm b.ColD vào mệnh đề AND thay vì WHERE thì sao? Điều đó sẽ không làm cho truy vấn hiệu quả hơn? Tôi biết kết quả có thể khác nhau trong cả hai cách tiếp cận nhưng tôi không biết tại sao?

Cảm ơn.

+0

Đánh giá bằng thẻ tsql, bạn đang sử dụng SQL Server. Studio quản lý có khả năng hiển thị kế hoạch thực hiện truy vấn, vì vậy bạn có thể so sánh sự khác biệt của cả hai phiên bản. Tuy nhiên, _guess_ của tôi là sẽ không có nhiều khác biệt. –

+3

Đây không phải là bản sao: OP đang hỏi về bộ lọc chứ không phải là JOIN – gbn

+1

@gbn Tôi không chắc liệu từ ngữ của OP ("bộ lọc" so với "điều kiện", v.v.) có quan trọng đến mức không, vì ví dụ do OP đưa ra về cơ bản giống như [ở đây] (http://stackoverflow.com/q/1907335/880904), [tại đây] (http://stackoverflow.com/q/1018952/880904), [tại đây] (http://stackoverflow.com/q/1401889/880904), [tại đây] (http://stackoverflow.com/q/15483808/880904) và hơn thế nữa. Tất cả những người có 'JOIN ... ON', hỏi về 'WHERE', và bao gồm các câu trả lời tương tự cho bạn. Dường như với tôi rằng câu hỏi này đã được trả lời, hoặc chúng ta cũng nên mở lại [câu hỏi này] (http://stackoverflow.com/q/13145275/880904)? –

Trả lời

2

Trong ngôn ngữ khai báo như SQL tôi thấy hữu ích khi khai báo có thể, tức là giữ logic JOIN ("làm cách nào để kết nối dữ liệu của tôi?") Tách biệt với logic WHERE ("Tôi muốn lọc ngoài?").

Về mặt kỹ thuật, nó có thể hoàn toàn không có sự khác biệt, nhưng đó là một sự kiểm tra độ tỉnh táo tốt nếu bạn buộc mình phải tách riêng hai.

9

Nó hiếm khi tạo sự khác biệt trong trải nghiệm của tôi. Nó có thể, nhưng không thường xuyên. Trình tối ưu hóa truy vấn hoạt động những điều này và bạn không cần phải đoán thứ hai.

Khi sử dụng LEFT JOIN tuy nhiên, sau đó nó có thể quan trọng bởi vì nó thay đổi ngữ nghĩa truy vấn

Nói chung, I would separate JOIN and WHERE conditions for clarity and avoid ambiguities or partial/full cross joins. Câu trả lời này cho biết thêm chỉ

Lưu ý: câu hỏi là không "JOIN trong WHERE khác biệt" nhưng "WHERE trong sự khác biệt THAM GIA"

tôi chỉ đơn giản sẽ làm điều này

SELECT 
    a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM 
    TblA a 
    INNER JOIN 
    TblB b On a.ColA = b.ColD 
WHERE 
    a.ColA = 'X' AND a.ColB = 'Y' AND b.ColD = 'ABC' 

Hoặc, nếu phức tạp hơn và tôi muốn làm cho nó đọc tốt hơn
Điều này cũng có thể giúp ích nếu người tối ưu hóa ngu ngốc (hiếm):

SELECT 
    a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM 
    (SELECT ColA, ColB, ColC FROM TblA 
    WHERE ColA = 'X' AND ColB = 'Y') a 
    INNER JOIN 
    (SELECT ColD, ColE FROM TblB WHERE ColD = 'ABC') b On a.ColA = b.ColD 

Trong trường hợp cuối cùng này, người dùng cũng có thể sử dụng CTE để chia nhỏ hơn nữa cho khả năng đọc