web-dev-qa-db-fra.com

Alias ​​SQL pour l'instruction SELECT

Je voudrais faire quelque chose comme 

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

Est-il possible de faire en quelque sorte la partie "AS my_select" (c'est-à-dire affecter un alias à une instruction SELECT)?

(Remarque: il s'agit d'une question théorique. Je réalise que je peux le faire sans affecter un alias à une instruction SELECT, mais j'aimerais savoir si je peux le faire avec cela.)

25
Paul S.

Vous ne savez pas exactement ce que vous essayez de décrire avec cette syntaxe, mais dans presque tous les SGBDR, vous pouvez utiliser une sous-requête dans la clause FROM (parfois appelée une "vue en ligne"):

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

Dans les SGBDR "d'entreprise" avancés (comme Oracle, SQL Server, postgresql), vous pouvez utiliser des expressions de table communes qui vous permettent de faire référence à une requête par son nom et de la réutiliser plusieurs fois:

-- 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;

(exemple de http://msdn.Microsoft.com/en-us/library/ms190766(v=sql.105).aspx )

36
Roland Bouman

Vous pouvez le faire en utilisant la clause WITH de l'instruction SELECT:

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

C'est la syntaxe ANSI/ISO SQL. Je sais que SQL Server, Oracle et DB2 le prennent en charge. Pas sûr des autres ...

5
RBarryYoung

Oui, mais vous ne pouvez sélectionner qu'une colonne dans votre sous-sélection

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

Vous pouvez stocker cela dans une table temporaire.

Ainsi, au lieu de faire la requête CTE/sub, vous utiliseriez une table temporaire.

Bon article sur ceux-ci ici http://codingsight.com/introduction-to-temporary-tables-in-sql-server/

0
WRD299