Subconsultas SQL (Microsoft Access SQL)
Aplica-se ao: Access 2013, Office 2013
Uma subconsulta é uma instrução SELECT aninhada dentro de uma instrução SELECT, SELECT…INTO, INSERT…INTO, DELETE ou UPDATE ou dentro de outra subconsulta.
Sintaxe
Você pode usar três formas de sintaxe para criar uma subconsulta:
comparison [ANY | ALL | SOME] (sqlstatement)
expression [NOT] IN (sqlstatement)
[NOT] EXISTS (sqlstatement)
Uma subconsulta contém estas partes:
Sair |
Descrição |
---|---|
comparação |
Uma expressão e uma operador de comparação que compara a expressão com os resultados da subconsulta. |
expressão |
Uma expressão na qual o resultado definido da subconsulta é pesquisado. |
sqlstatement |
Uma instrução SELECT, seguindo o mesmo formato e as mesmas regras que qualquer outra instrução SELECT. Ela deve estar entre parênteses. |
Comentários
Você pode usar uma subconsulta em vez de uma expressão na lista de campos de uma instrução SELECT ou em uma cláusula WHERE ou HAVING. Em uma subconsulta, use uma instrução SELECT para fornecer um conjunto de um ou mais valores específicos para serem avaliados na expressão da cláusula WHERE ou HAVING.
Use o predicado ANY ou SOME, que são sinônimos, para recuperar registros na consulta principal que atenda à comparação com qualquer registro recuperado na subconsulta. O exemplo a seguir retorna todos os produtos cujo preço de unidade é maior que o preço de qualquer outro produto vendido com um desconto de 25% ou mais:
SELECT * FROM Products
WHERE UnitPrice > ANY
(SELECT UnitPrice FROM OrderDetails
WHERE Discount >= .25);
Use o predicado ALL para recuperar somente aqueles registros na consulta principal que atendam à comparação com todos os registros recuperados na subconsulta. Se você mudar de ANY para ALL no exemplo anterior, a consulta retornará somente aqueles produtos cujo preço da unidade for maior que o preço de todos os produtos vendidos com um desconto de 25% ou mais. Isso é muito mais restritivo.
Use o predicado IN para recuperar somente aqueles registros na consulta principal para os quais algum registro na subconsulta contém um valor igual. O exemplo a seguir retorna todos os produtos com um desconto de 25% ou mais:
SELECT * FROM Products
WHERE ProductID IN
(SELECT ProductID FROM OrderDetails
WHERE Discount >= .25);
De modo oposto, você NÃO pode usar IN para recuperar somente aqueles registros na consulta principal para os quais algum registro na subconsulta contém um valor igual.
Use o predicado EXISTS (com a palavra reservada opcional NOT) em comparações true/false para determinar se a subconsulta retorna algum registro.
Você também pode usar os aliases do nome da tabela em um subconsulta para se referir a tabelas listadas em uma cláusula FROM fora da subconsulta. O exemplo a seguir retorna os nomes de funcionários cujos salários são iguais ou maiores que o salário médio de todos os funcionários que têm o mesmo cargo. A tabela Funcionários recebe o alias "T1":
SELECT LastName,
FirstName, Title, Salary
FROM Employees AS T1
WHERE Salary >= (SELECT Avg(Salary)
FROM Employees
WHERE T1.Title = Employees.Title) Order by Title;
No exemplo anterior, a palavra reservada AS é opcional.
Algumas subconsultas são permitidas em consultas de de tabela de referência cruzada especificamente, como predicados (aqueles na cláusula WHERE). As subconsultas como saída (aquelas na lista SELECT) não são permitidas nas consultas de tabela de referência cruzada.
Exemplo
This example lists the name and contact of every customer who placed an order in the second quarter of 1995. Ele chama o procedimento EnumFields, o qual você pode encontrar no exemplo da instrução SELECT.
Sub SubQueryX()
Dim dbs As Database, rst As Recordset
' Modify this line to include the path to Northwind
' on your computer.
Set dbs = OpenDatabase("Northwind.mdb")
' List the name and contact of every customer
' who placed an order in the second quarter of
' 1995.
Set rst = dbs.OpenRecordset("SELECT ContactName," _
& " CompanyName, ContactTitle, Phone" _
& " FROM Customers" _
& " WHERE CustomerID" _
& " IN (SELECT CustomerID FROM Orders" _
& " WHERE OrderDate Between #04/1/95#" _
& " And #07/1/95#);")
' Populate the Recordset.
rst.MoveLast
' Call EnumFields to print the contents of the
' Recordset. Pass the Recordset object and desired
' field width.
EnumFields rst, 25
dbs.Close
End Sub