SELECT语句的SQL别名

Pau*_* S. 26 sql select alias

我想做点什么

(SELECT ... FROM ...) AS my_select
WHERE id IN (SELECT MAX(id) FROM my_select GROUP BY name)
Run Code Online (Sandbox Code Playgroud)

是否有可能以某种方式执行"AS my_select"部分(即为SELECT语句分配别名)?

(注意:这是一个理论问题.我意识到我可以在不为SELECT语句指定别名的情况下执行此操作,但我想知道我是否可以使用它.)

Rol*_*man 39

不确定您尝试用该语法表示什么,但在几乎所有RDBMS-es中,您都可以在FROM子句中使用子查询(有时称为"内联视图"):

SELECT..
FROM (
     SELECT ...
     FROM ...
     ) my_select
WHERE ...
Run Code Online (Sandbox Code Playgroud)

在高级"企业"RDBMS-es(如oracle,SQL Server,postgresql)中,您可以使用公用表表达式,它允许您按名称引用查询并重复使用多次:

-- 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;
Run Code Online (Sandbox Code Playgroud)

(例如来自http://msdn.microsoft.com/en-us/library/ms190766(v=sql.105).aspx)


RBa*_*ung 6

您可以使用SELECT语句的WITH子句执行此操作:

;
WITH my_select As (SELECT ... FROM ...) 
SELECT * FROM foo
WHERE id IN (SELECT MAX(id) FROM my_select GROUP BY name)
Run Code Online (Sandbox Code Playgroud)

这是ANSI/ISO SQL语法.我知道SQL Server,Oracle和DB2都支持它.不确定其他人......