2012-07-13 30 views
17

Tôi muốn làm điều gì đó nhưSQL bí danh cho SELECT tuyên bố

(SELECT ... FROM ...) AS my_select 
WHERE id IN (SELECT MAX(id) FROM my_select GROUP BY name) 

Có thể bằng cách nào đó làm "AS my_select" một phần (ví dụ: gán một bí danh cho một câu lệnh SELECT)?

(Lưu ý:.. Đây là một câu hỏi lý thuyết Tôi nhận ra rằng tôi có thể làm điều đó mà không cần gán một bí danh cho một câu lệnh SELECT, nhưng tôi muốn biết liệu tôi có thể làm điều đó với điều đó)

+0

Có bất kỳ câu trả lời nào trong số những câu trả lời này thỏa đáng không? Vui lòng đánh dấu vào ô nếu bạn xem xét câu trả lời. –

Trả lời

28

Không chắc chính xác những gì bạn cố gắng để biểu thị với cú pháp đó, nhưng ở hầu hết các RDBMS-es bạn có thể sử dụng một subquery trong mệnh đề FROM (đôi khi được gọi là một " inline-view "):

SELECT.. 
FROM (
    SELECT ... 
    FROM ... 
    ) my_select 
WHERE ... 

Trong tiên tiến "doanh nghiệp" RDBMS-es (như Oracle, SQL Server, postgresql), bạn có thể sử dụng các biểu bảng phổ biến cho phép bạn tham khảo một truy vấn theo tên và tái sử dụng nó thậm chí nhiều lần:

-- Define the CTE expression name and column list. 
WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear) 
AS 
-- Define the CTE query. 
(
    SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear 
    FROM Sales.SalesOrderHeader 
    WHERE SalesPersonID IS NOT NULL 
) 
-- Define the outer query referencing the CTE name. 
SELECT SalesPersonID, COUNT(SalesOrderID) AS TotalSales, SalesYear 
FROM Sales_CTE 
GROUP BY SalesYear, SalesPersonID 
ORDER BY SalesPersonID, SalesYear; 

(ví dụ từ http://msdn.microsoft.com/en-us/library/ms190766(v=sql.105).aspx)

+1

+1 cho các biểu thức bảng chung. – Josien

0

Vâng, nhưng bạn có thể chọn chỉ có một cột trong subselect bạn

SELECT (SELECT id FROM bla) AS my_select FROM bla2 
3

Bạn có thể làm điều này bằng cách sử dụng mệnh đề WITH của câu lệnh SELECT:

; 
WITH my_select As (SELECT ... FROM ...) 
SELECT * FROM foo 
WHERE id IN (SELECT MAX(id) FROM my_select GROUP BY name) 

Đó là ANSI/ISO SQL Cú pháp. Tôi biết rằng SQL Server, Oracle và DB2 hỗ trợ nó. Không chắc chắn về những người khác ...