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.)
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 )
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 ...
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
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/