Tôi đang bối rối bởi một truy vấn SQL, và trung thực, một trong những điều mà tôi thậm chí không chắc chắn làm thế nào để google cho. Do đó StackOverflow.Tại sao truy vấn con này KHÔNG gây ra lỗi?
Tôi có những gì tôi nghĩ là một truy vấn đơn giản.
SELECT Id
FROM Customer
WHERE Id IN (SELECT Id from @CustomersWithCancelledOrders)
Đây là nơi tôi thấy sự kỳ quặc. Không có cột nào được gọi là Id trong biến bảng @CustomersWithCancelledOrders. Nhưng không có lỗi.
Kết quả này là các Id cho tất cả Khách hàng. Từng người một. Mà rõ ràng là đánh bại các điểm làm một truy vấn phụ ở nơi đầu tiên.
Giống như việc sử dụng cột Id từ bảng bên ngoài (Khách hàng), nhưng tôi không hiểu tại sao nó lại làm điều đó. Có bao giờ là lý do bạn muốn làm điều đó không? Tôi có thiếu cái gì đó vô cùng rõ ràng không?
SQLFiddle sự kỳ quặc. Nó không phải là SQL Fiddle tốt nhất, vì tôi không thể tìm ra cách trả lại nhiều tập kết quả trên trang web đó, nhưng nó thể hiện cách tôi chạy qua vấn đề này.
Tôi cho rằng những gì tôi đang tìm kiếm là tên cho "tính năng" ở trên, một số loại thông tin về lý do tại sao nó hoạt động và những gì truy vấn không chính xác thực sự có ý nghĩa.
Tôi đã cập nhật câu hỏi trên để sử dụng ví dụ tốt hơn một chút. Nó vẫn còn tiếp tục, nhưng nó gần gũi hơn với kịch bản tôi đã viết khi tôi thực sự gặp phải vấn đề.
Sau khi đọc một số truy vấn con tương quan, có vẻ như lỗi đánh máy của tôi (sử dụng cột Id sai trong truy vấn phụ) sẽ thay đổi hành vi của truy vấn phụ.
Thay vì đánh giá các kết quả của truy vấn phụ một lần và sau đó xử lý các kết quả đó dưới dạng tập hợp (đó là những gì tôi dự định), nó đánh giá truy vấn con cho mỗi hàng trong truy vấn bên ngoài.
Điều này có nghĩa là truy vấn phụ sẽ đánh giá một tập hợp các kết quả khác nhau cho mỗi hàng và tập hợp kết quả đó được đảm bảo để có Id khách hàng của hàng đó trong đó. Truy vấn con trả về một tập hợp gồm Id của hàng lặp lại số lần X, trong đó X là số hàng trong biến bảng đang được chọn.
...
Thật khó để viết ra mô tả ngắn gọn về sự hiểu biết của tôi về vấn đề này. Lấy làm tiếc. Tôi nghĩ rằng tôi tốt bây giờ mặc dù.
Thật không may, khó có thể biết được bạn là người mới hay đã đơn giản hóa một trường hợp hợp lệ, nhưng hầu hết thời gian bạn có lẽ nên tham gia các bảng thay vì sử dụng truy vấn phụ. – JamesRyan
Thuật ngữ kỹ thuật bạn đang tìm kiếm là 'truy vấn con tương quan '. – Brandon
@JamesRyan Tôi đã viết một truy vấn nhanh ngày hôm qua và tình cờ vô tình viết một truy vấn UPDATE tương tự như trên. Việc sử dụng ID bên ngoài trong truy vấn con là một lỗi đánh máy, và tôi đã rất ngạc nhiên khi nó cập nhật tất cả các bản ghi trong bảng thay vì tập hợp con mà tôi dự định. –