Escolar Documentos
Profissional Documentos
Cultura Documentos
Utilizando subqueries
O que podemos dizer sobre as subqueries é que elas podem ser usadas
para a realização de pesquisas compostas, onde uma informação da
qual estamos precisando depende de uma ou mais informações vindas
com base em outras respostas. Para esse tipo de consulta, duas ou
mais consultas precisam ser executadas, onde, a primeira consulta
que irá localizar a informação desejada, mas que é na segunda
consulta que irá encontrar a informação que será utilizada para
comparação, e dessa forma, realizarmos o cálculo do resultado desta
comparação, nos trazendo assim a informação requerida. A utilização
de subconsultas é uma abordagem que nos fornece grande capacidade
de incorporarmos consultas umas nas outras. Vejamos como é a
sintaxe de acordo com a Listagem 3.
SELECT [ProductID]
FROM [AdventureWorks2012].[Production].[Product]
WHERE [Name] = 'Blade'
SELECT
[ProductID]
,[Name]
,[ProductNumber]
,[Color]
FROM [AdventureWorks2012].[Production].[Product]
WHERE [ProductID] = 316
Utilizando operadores de comparação em
subqueries de linha única
SELECT [PurchaseOrderID]
,[DueDate]
,[OrderQty]
,[UnitPrice]
FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderDetail]
WHERE [PurchaseOrderID] > (
SELECT AVG([PurchaseOrderID])
FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderDetail]
WHERE [DueDate] = '2007-10-31'
)
SELECT AVG([PurchaseOrderID])
,[VendorID]
,COUNT([VendorID])
FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderHeader]
GROUP BY [VendorID]
HAVING AVG([PurchaseOrderID]) =
(SELECT AVG([PurchaseOrderID])
FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderHeader]
where VendorID = 1690
)
SELECT [ProductID]
FROM
(SELECT [ProductID]
FROM [AdventureWorks2012].[Production].[Product]
WHERE [ProductID] < 320) as TESTE
SELECT [ProductID]
,[Name]
FROM [AdventureWorks2012].[Production].[Product]
WHERE [ProductID] = (
SELECT ProductID
FROM [AdventureWorks2012].[Production].[Product]
WHERE [Name] LIKE '%a%'
)
SELECT [PurchaseOrderID]
,[VendorID]
,[OrderDate]
,[TotalDue]
FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderHeader]
WHERE [VendorID] IN (
SELECT [VendorID] FROM
[AdventureWorks2012].[Purchasing].[PurchaseOrderHeader]
WHERE [EmployeeID] = 255
SELECT [PurchaseOrderID]
,[VendorID]
,[OrderDate]
,[TotalDue]
FROM [AdventureWorks2012].[Purchasing].[PurchaseOrderHeader]
WHERE [VendorID] = ANY (
SELECT [VendorID] FROM
[AdventureWorks2012].[Purchasing].[PurchaseOrderHeader]
WHERE [EmployeeID] = 255
)
Como o próprio título nos informa, este é o tipo de consulta que será
realizado utilizando-se de duas ou mais colunas, dependendo da
granularidade necessária a nossa necessidade. Neste exemplo,
buscaremos por todas as informações referentes ao id da pessoa,
número de ordem de compra, número do pedido de compra e o id do
cliente, todas essas informações a partir de uma consulta com base
nas informações de [SalesOrderNumber] e [PurchaseOrderNumber],
primeiro verificando se eles existem, utilizando a cláusula EXISTS.
Vejamos então de forma prática como ficaria nossa consulta, como
apresentada Listagem 13.
SELECT [SalesOrderID]
,[SalesPersonID]
,[SalesOrderNumber]
,[PurchaseOrderNumber]
,[CustomerID]
FROM [AdventureWorks2012].[Sales].[SalesOrderHeader]
WHERE EXISTS
(SELECT [SalesOrderNumber],[PurchaseOrderNumber]
FROM [AdventureWorks2012].[Sales].SalesOrderHeader
)
ORDER BY [SalesPersonID] DESC
Sintaxe:
INSERT INTO tabela (colunas)
(SELECT coluna(s)
FROM tabela(s)
WHERE coluna operador valor);
Usando uma subconsulta, vamos popular esta nova tabela com os livros que tenham
mais de 600 páginas e seus respectivos assuntos:
Após executar o comando, efetuamos uma consulta à nova tabela para verificar se os
dados foram inseridos com sucesso:
Resultado:
Também podemos usar uma subconsulta com uma instrução UPDATE, permitindo
atualizar os valores de registros de uma tabela com base no resultado retornado pela
subconsulta.
Sintaxe:
UPDATE tabela
SET coluna(s) = valor
WHERE coluna operador (SELECT coluna(s)
FROM tabela
WHERE coluna operador valor);
Exemplo: Vamos aumentar os preços dos livros da editora Microsoft Press em 12%
usando a declaração UPDATE. Como não sabemos o ID desta editora de memória,
vamos usar uma subconsulta para nos auxiliar:
UPDATE tbl_livro
SET PrecoLivro = PrecoLivro * 1.12
WHERE IdEditora =
(SELECT IdEditora
FROM tbl_Editora
WHERE NomeEditora = 'Microsoft Press');
Sintaxe:
Subconsultas encadeadas
Sintaxe básica:
SELECT coluna(s)
FROM tabela(s)
WHERE coluna operador (SELECT coluna
FROM tabela
WHERE coluna operador (SELECT coluna
FROM tabela
WHERE coluna operador valor);