Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula 10 – LECT
29 de Abril de 2003
Subqueries correlacionadas – pequena
revisão
Problema:
– Obter Nome, Numero de Sócio e Data de
Ultimo Empréstimo (aula teórica de revisão)
– Solução apresentada não funciona(va)
3 Formas de Solução:
– Subquery no SELECT
– Subquery no WHERE
– Tabelas “calculadas”
Subquery no SELECT
SELECT S.Nome, S.Numero, (SELECT TOP 1 E.DataInicial FROM Emprestimo E WHERE
E.RefIDSocio=S.IDSocio ORDER By E.DataInicial DESC) AS DataUltimoEmprestimo FROM
Socio S;
Aspectos relevantes:
– Uso de alias nas tabelas
– Relação estabelecida entre a query exterior e a query
interior (por meio dos alias)
– Necessita de uma condição para eliminar Datas Nulas
– Implementada pela query
Solução1ProblemaUltimoEmprestimo na base de dados
da aula
Subquery no WHERE
SELECT S.Nome, S.Numero, E.DataInicial
FROM Socio AS S INNER JOIN Emprestimo AS E ON S.IDSocio=E.RefIDSocio
WHERE E.DataInicial = (SELECT Max(E2.DataInicial) As DataUltimoEmp FROM
Emprestimo E2 WHERE E2.RefIDSocio=S.IDSocio);
Aspectos relevantes:
– Uso de alias nas tabelas
– Relação estabelecida entre a query exterior e a query
interior (por meio dos alias), mas desta vez na cláusula
WHERE
– Implementada pela query
Solução2ProblemaUltimoEmprestimo na base de dados
da aula
Tabelas “calculadas” ou “derivadas”
SELECT [Socio].[Nome], [Socio].[Numero], Q1.DataUltimoEmp
FROM Socio INNER JOIN (SELECT RefIDSocio, Max(DataInicial) As DataUltimoEmp
FROM Emprestimo Group By RefIDSocio) AS Q1 ON [Socio].
[IDSocio]=Q1.RefIDSocio;
Aspectos relevantes:
– Temos um statement SELECT que funciona como se de uma
tabela se tratasse
– Para podermos referenciá-lo como uma tabela, temos de lhe dar
um alias
– Do ponto de vista prático é como se Q1 fosse uma query pré-
gravada que é incluída noutra query
– Implementada pela query Solução3ProblemaUltimoEmprestimo
na base de dados da aula. CUIDADO: O Access guarda-a com
uma sintaxe que tem de ser alterada para a query poder ser
executada
Uso de tabelas ligadas
Divisão de uma base de dados em duas:
– base de dados de dados
– base de dados de aplicação
– Uso do Database Splitter:
Menu Database Utilities -> Database Splitter
Cria-se uma base de dados “back-end” (normalmente como o
nome da original e com o sufixo “_be” na parte final do nome)
e outra “front-end” (nome inalterado)
As tabelas são graficamente representadas de modo distinto na
BD front-end
A BD back-end só tem tabelas; A front-end tem todos os outros
elementos, para além de tabelas ligadas
Uso de tabelas ligadas
Inconveniente “aborrecido”:
– O path para a base de dados back-end é fixo, o
que levanta problemas se a localização de uma
ou das duas BDs for alterada
Vantagens (da divisão em duas):
– Separação de dados de aplicação
Uso de tabelas ligadas
Numa qualquer base de dados Access podem existir
tabelas ligadas, que não têm necessariamente de ser todas
As tabelas podem ser ligadas a qualquer base de dados
que tenha um driver ODBC, desde que se crie um D(ata)
S(ource) N(ame):
– SQL Server (o mais comum)
– Oracle, DB2, MySQL, até bases de dados mais antigas, como
Dbase
A base de dados a que se faz a ligação pode não ser local:
rede ou Internet (no caso de SQL Server ou outros SGBD
servidores)
ADO – Ligações a BDs
Definição de uma ligação a BD:
– Access, OLEDB:
strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=c:\shared\Aula10.mdb“
– SQL Server, OLEDB:
strConnString = "Provider=SQLOLEDB;Data
Source=localhost;database=myDBName;uid=MyID;pwd=My
PWd;"
– Usa-se este valor na abertura da ligação:
Set cnn = New ADODB.Connection
cnn.open strConnString ‘Abre a ligação
ADO – Abertura de recordsets