Câu lệnh chọn lồng nhau trong SQL Server


388

Tại sao không làm việc sau đây?

SELECT name FROM (SELECT name FROM agentinformation)

Tôi đoán rằng sự hiểu biết của tôi về SQL là sai, vì tôi đã nghĩ rằng điều này sẽ trả lại điều tương tự như

SELECT name FROM agentinformation

Không phải câu lệnh chọn bên trong sẽ tạo ra một tập kết quả mà câu lệnh SELECT bên ngoài sau đó truy vấn?

Câu trả lời:


673

Bạn cần bí danh các truy vấn con.

SELECT name FROM (SELECT name FROM agentinformation) a  

hoặc để rõ ràng hơn

SELECT a.name FROM (SELECT name FROM agentinformation) a  

76
Hãy chắc chắn rằng bí danh của bạn là hơi dài dòng! Tôi thích khi tôi làm việc trên một wuery với t1, t2, t3, t4, t5, t6
Doug Chamberlain

2
Trường hợp một wheremệnh đề sẽ đi cho truy vấn bên ngoài?
Đại tá Panic

3
@ColonelPanic: Mệnh đề WHERE cho truy vấn bên ngoài sẽ được giải quyết vào cuối.
Joe Stefanelli

"Phải, tôi là một thằng ngốc! Cảm ơn, sẽ chấp nhận một khi được phép." Không Chỉ là không biết gì. Giống như tất cả chúng ta.
Lucio Mollinedo

2
Oracle chấp nhận đầu tiên selectmà không có bí danh.
Kjetil S.

49

Câu trả lời được cung cấp bởi Joe Stefanelli đã chính xác.

SELECT name FROM (SELECT name FROM agentinformation) as a  

Chúng ta cần tạo một bí danh của truy vấn con bởi vì một truy vấn cần một đối tượng bảng mà chúng ta sẽ nhận được từ việc tạo bí danh cho truy vấn phụ. Về mặt khái niệm, các kết quả truy vấn con được thay thế vào truy vấn bên ngoài. Khi chúng ta cần một đối tượng bảng trong truy vấn bên ngoài, chúng ta cần tạo bí danh cho truy vấn bên trong.

Các báo cáo bao gồm một truy vấn con thường có một trong các hình thức sau:

  • Biểu thức WHERE [KHÔNG] IN (truy vấn con)
  • So sánh biểu thức WHERE_operator [BẤT K | | TẤT CẢ] (truy vấn phụ)
  • Ở ĐÂU [KHÔNG] EXISTS (truy vấn phụ)

Kiểm tra các quy tắc truy vấn phụcác loại truy vấn phụ .

Thêm ví dụ về các câu hỏi con lồng nhau.

  1. IN / NOT IN - Toán tử này nhận đầu ra của truy vấn bên trong sau khi truy vấn bên trong được thực thi có thể bằng 0 hoặc nhiều giá trị và gửi nó đến truy vấn bên ngoài. Sau đó, truy vấn bên ngoài tìm nạp tất cả các hàng [toán tử IN] hoặc không khớp [toán tử KHÔNG IN].

  2. BẤT K - - [> BẤT K or Toán tử nào lấy danh sách các giá trị được tạo bởi truy vấn bên trong và tìm nạp tất cả các giá trị lớn hơn giá trị tối thiểu của danh sách. Các

ví dụ> BẤT K ((100,200,300), toán tử BẤT K will sẽ tìm nạp tất cả các giá trị lớn hơn 100.

  1. Toán tử ALL - [> ALL hoặc ALL lấy danh sách các giá trị được tạo bởi truy vấn bên trong và tìm nạp tất cả các giá trị lớn hơn mức tối đa của danh sách. Các

ví dụ> ALL (100.200.300), toán tử ALL sẽ tìm nạp tất cả các giá trị lớn hơn 300.

  1. EXISTS - Từ khóa EXISTS tạo ra giá trị Boolean [TRUE / FALSE]. EXISTS này kiểm tra sự tồn tại của các hàng được trả về bởi truy vấn phụ.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.