我想做类似的事情
(SELECT ... FROM ...) AS my_select
WHERE id IN (SELECT MAX(id) FROM my_select GROUP BY name)
是否有可能以某种方式执行“AS my_select”部分(即为 SELECT 语句分配别名)?
(注意:这是一个理论问题。我意识到我可以在不为 SELECT 语句分配别名的情况下做到这一点,但我想知道我是否可以这样做。)
不确定您尝试使用该语法表示的确切内容,但在几乎所有 RDBMS-es 中,您都可以在 FROM 子句中使用子查询(有时称为“内联视图”):
SELECT..
FROM (
SELECT ...
FROM ...
) my_select
WHERE ...
在高级“企业”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;
(来自http://msdn.microsoft.com/en-us/library/ms190766(v=sql.105).aspx的示例)
您可以使用 SELECT 语句的 WITH 子句来执行此操作:
;
WITH my_select As (SELECT ... FROM ...)
SELECT * FROM foo
WHERE id IN (SELECT MAX(id) FROM my_select GROUP BY name)
这就是 ANSI/ISO SQL 语法。我知道 SQL Server、Oracle 和 DB2 都支持它。不知道其他...
是的,但您只能在子选择中选择一列
SELECT (SELECT id FROM bla) AS my_select FROM bla2
您可以将其存储到临时表中。
因此,您将使用临时表,而不是执行 CTE/sub 查询。
关于这些的好文章在这里http://codingsight.com/introduction-to-temporary-tables-in-sql-server/