28

私は次のようなことをしたいと思います

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

「AS my_select」部分を何とかすることは可能ですか (つまり、エイリアスを SELECT ステートメントに割り当てますか?)

(注:これは理論的な質問です。SELECTステートメントにエイリアスを割り当てなくてもできることはわかっていますが、それでできるかどうか知りたいです。)

4

4 に答える 4

43

その構文で何を表現しようとしているのか正確にはわかりませんが、ほとんどすべての RDBMS で、FROM 句でサブクエリを使用できます (「インライン ビュー」と呼ばれることもあります)。

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

高度な「エンタープライズ」RDBMS (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の例)

于 2012-07-13T22:17:46.847 に答える
7

これは、SELECTステートメントのWITH句を使用して実行できます。

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

これがANSI/ISOSQL構文です。SQL Server、Oracle、DB2がそれをサポートしていることを私は知っています。他の人についてはよくわかりません...

于 2012-07-13T22:19:20.993 に答える
1

はい。ただし、副選択で選択できる列は 1 つだけです

SELECT (SELECT id FROM bla) AS my_select FROM bla2
于 2012-07-13T22:14:37.500 に答える