web-dev-qa-db-ja.com

SELECTステートメントのSQLエイリアス

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

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

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

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

26
Paul S.

その構文で何を表示しようとしているのか正確にはわかりませんが、ほとんどすべての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

39
Roland Bouman

これを行うには、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がサポートしていることは知っています。他の人についてはわからない...

6
RBarryYoung

はい。ただし、サブセレクトで選択できる列は1つだけです

SELECT (SELECT id FROM bla) AS my_select FROM bla2
0
Besnik

これを一時テーブルに保存できます。

したがって、CTE/subクエリを実行する代わりに、一時テーブルを使用します。

これらに関する良い記事はこちら http://codingsight.com/introduction-to-temporary-tables-in-sql-server/

0
WRD299