Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
CREATE TABLE Taxi (
Prefixo CHAR(4),
Placa CHAR(7) NOT NULL,
Marca CHAR(30),
Modelo CHAR(30),
NomeMotorista CHAR(30) NOT NULL,
Ano NUMBER(4) NOT NULL CHECK (Ano > 2000),
CONSTRAINT PkTaxi PRIMARY KEY (Prefixo)
);
CREATE TABLE Passageiro (
CPF NUMBER(8),
Nome CHAR(30),
email CHAR(30),
telefone NUMBER(8),
CONSTRAINT PkPassageiro PRIMARY KEY (CPF)
);
CREATE TABLE Corrida (
Id NUMBER(6),
BairroDaPartida CHAR(30) CHECK (BairroDaPartida IN ('Floresta','Sao Joao','Higienopolis','Auxiliadora')),
Valor NUMBER(5),
Kms NUMBER(5),
Prefixo CHAR(4),
CPF NUMBER(8),
CONSTRAINT PkCorrida PRIMARY KEY (Id),
CONSTRAINT FkCorridaTaxi FOREIGN KEY (Prefixo) REFERENCES Taxi,
CONSTRAINT FkCorridaPassageiro FOREIGN KEY (CPF) REFERENCES Passageiro
);
Como faço para:
--d.Listar os prefixos dos taxis que não realizaram corridas tanto partindo do bairro 'Floresta' quanto do bairro 'Sao Joao'.
--e.Listar os nomes dos passageiras e dos motoristas de taxis que realizaram corridas mais de uma vez juntos
D - tente com NOT EXISTS.aspx)
E - tente Count group by com having
SELECT c.prefixo, t.nomemotorista, p.nome, COUNT(c.id) AS qtd_corridas INTO #corridas
FROM corrida c
INNER JOIN taxi t ON t.prefixo = c.prefixo
INNER JOIN passageiro p ON p.cpf = c.cpf
WHERE c.bairrodapartida NOT IN('Floresta', 'Sao Joao')
GROUP BY c.prefixo, t.marca, t.nomemotorista, p.nome
SELECT * FROM #corridas WHERE qtd_corridas > 1
Não esqueça de deletar a tabela temporária #corridas após executar a consulta ou antes de executar caso ela exista.
>
Caro tente utilizar o SQL abaixo:
SELECT c.prefixo, t.marca, t.nomemotorista FROM corrida c INNER JOIN taxi t ON t.prefixo = c.prefixo WHERE c.bairrodapartida NOT IN('Floresta', 'Sao Joao');
NOT IN: trás tudo que não contém os parametros passados.
INNER JOIN: é apenas para informar quais são os motoristas mas se quiser apenas o prefixo mesmo acaba sendo desnecessário.
Me avise se deu certo.
Estou usando o Oracle Application Express, ele não usa INNER JOIN
>
D - tente com NOT EXISTS.aspx)
E - tente Count group by com having
Estes não funcionaram corretamente.
D- select distinct Prefixo from Corrida where not exists (select Id from Corrida Where BairroDaPartida = all('Sao Joao','Floresta'));
E-select T.NomeMotorista, P.Nome from Taxi T, Passageiro P, Corrida C group by P.Nome, T.NomeMotorista having count(P.Nome) > 1;Nunca utilizei Oracle mas é estranho não ter INNER JOIN enfim. Tente relacionar as tabelas do modo abaixo. Ao menos em SQLServer e MySQL funciona. Perceba que relaciono as tabelas pelo WHERE e no FROM informo quais tabelas devem ser utilizadas que no seu caso são três. Acredito que se seu problema for apenas o relacionamento isso deve ajudar.
Obs: não esqueça de utilizar um AND para informar mais de um relacionamento.
SELECT * FROM tbl_usuario, tbl_acessos WHERE tbl_usuario.id_usuario = tbl_acessos.id_usuario
>
Nunca utilizei Oracle mas é estranho não ter INNER JOIN enfim. Tente relacionar as tabelas do modo abaixo. Ao menos em SQLServer e MySQL funciona. Perceba que relaciono as tabelas pelo WHERE e no FROM informo quais tabelas devem ser utilizadas que no seu caso são três. Acredito que se seu problema for apenas o relacionamento isso deve ajudar.
Obs: não esqueça de utilizar um AND para informar mais de um relacionamento.
SELECT * FROM tbl_usuario, tbl_acessos WHERE tbl_usuario.id_usuario = tbl_acessos.id_usuario
No caso tenho que selecionar os prefixos que não realizaram corridas tanto partindo do bairro 'Floresta' quanto do bairro 'Sao Joao'. acontece que alguns prefixos que realizaram corridas para 'Floresta' e 'Sao Joao' também realizam corridas para outros destinos como 'Higienopolis' por exemplo, e são estes prefixos que não consigo eliminar.
CREATE TABLE Taxi (
Prefixo CHAR(4),
Placa CHAR(7) NOT NULL,
Marca CHAR(30),
Modelo CHAR(30),
NomeMotorista CHAR(30) NOT NULL,
Ano NUMBER(4) NOT NULL CHECK (Ano > 2000),
CONSTRAINT PkTaxi PRIMARY KEY (Prefixo)
);
CREATE TABLE Passageiro (
CPF NUMBER(8),
Nome CHAR(30),
email CHAR(30),
telefone NUMBER(8),
CONSTRAINT PkPassageiro PRIMARY KEY (CPF)
);
CREATE TABLE Corrida (
Id NUMBER(6),
BairroDaPartida CHAR(30) CHECK (BairroDaPartida IN ('Floresta','Sao Joao','Higienopolis','Auxiliadora')),
Valor NUMBER(5),
Kms NUMBER(5),
Prefixo CHAR(4),
CPF NUMBER(8),
CONSTRAINT PkCorrida PRIMARY KEY (Id),
CONSTRAINT FkCorridaTaxi FOREIGN KEY (Prefixo) REFERENCES Taxi,
CONSTRAINT FkCorridaPassageiro FOREIGN KEY (CPF) REFERENCES Passageiro
);
Como faço para:
--d.Listar os prefixos dos taxis que não realizaram corridas tanto partindo do bairro 'Floresta' quanto do bairro 'Sao Joao'.
--e.Listar os nomes dos passageiras e dos motoristas de taxis que realizaram corridas mais de uma vez juntos
d usando NOT IN
--realizaram corridas tanto partindo do bairro 'Floresta' quanto do bairro 'Sao Joao'
select Prefixo
from corridas
where BairroDaPartida in ('Floresta','Sao Joao')
--Listar os prefixos dos taxis que não realizaram corridas tanto partindo do bairro 'Floresta' quanto do bairro 'Sao Joao'.
select *
from taxi
where Prefixo not in (select Prefixo
from corridas
where BairroDaPartida in ('Floresta','Sao Joao'))
2 usando group by having e tabela virtual
--passageiras e dos motoristas de taxis que realizaram corridas mais de uma vez juntos
select prefixo,cpf
from corrida
group by prefixo,cpf
having count(*) > 1
--
select taxi,nome_motorista , passageiro.nome
from taxi,passageiro,(select prefixo,cpf
from corrida
group by prefixo,cpf
having count(*) > 1) frequentes
where taxi,prefixo = frequente.prefixo
and passageiro.cpf = frequente.cpf
Creio ser isto (uma solução possíveL)Teste esse SQL. Caso de algum erro me informe.
SELECT c.prefixo, t.nomemotorista, p.nome, COUNT(c.id) AS qtd_corridas INTO #corridas
FROM corrida c, taxi t, passageiro p
WHERE (t.prefixo = c.prefixo AND p.cpf = c.cpf) AND c.prefixo NOT IN (
SELECT DISTINCT prefixo FROM corrida WHERE bairrodapartida IN('Floresta', 'Sao Joao','Higienopolis')
)
GROUP BY c.prefixo, t.nomemotorista, p.nome
SELECT * FROM #corridas WHERE qtd_corridas > 1
>
CREATE TABLE Taxi (
Prefixo CHAR(4),
Placa CHAR(7) NOT NULL,
Marca CHAR(30),
Modelo CHAR(30),
NomeMotorista CHAR(30) NOT NULL,
Ano NUMBER(4) NOT NULL CHECK (Ano > 2000),
CONSTRAINT PkTaxi PRIMARY KEY (Prefixo)
);
CREATE TABLE Passageiro (
CPF NUMBER(8),
Nome CHAR(30),
email CHAR(30),
telefone NUMBER(8),
CONSTRAINT PkPassageiro PRIMARY KEY (CPF)
);
CREATE TABLE Corrida (
Id NUMBER(6),
BairroDaPartida CHAR(30) CHECK (BairroDaPartida IN ('Floresta','Sao Joao','Higienopolis','Auxiliadora')),
Valor NUMBER(5),
Kms NUMBER(5),
Prefixo CHAR(4),
CPF NUMBER(8),
CONSTRAINT PkCorrida PRIMARY KEY (Id),
CONSTRAINT FkCorridaTaxi FOREIGN KEY (Prefixo) REFERENCES Taxi,
CONSTRAINT FkCorridaPassageiro FOREIGN KEY (CPF) REFERENCES Passageiro
);
Como faço para:
--d.Listar os prefixos dos taxis que não realizaram corridas tanto partindo do bairro 'Floresta' quanto do bairro 'Sao Joao'.
--e.Listar os nomes dos passageiras e dos motoristas de taxis que realizaram corridas mais de uma vez juntos
d usando NOT IN
--realizaram corridas tanto partindo do bairro 'Floresta' quanto do bairro 'Sao Joao'
select Prefixo
from corridas
where BairroDaPartida in ('Floresta','Sao Joao')
--Listar os prefixos dos taxis que não realizaram corridas tanto partindo do bairro 'Floresta' quanto do bairro 'Sao Joao'.
select *
from taxi
where Prefixo not in (select Prefixo
from corridas
where BairroDaPartida in ('Floresta','Sao Joao'))
2 usando group by having e tabela virtual
--passageiras e dos motoristas de taxis que realizaram corridas mais de uma vez juntos
select prefixo,cpf
from corrida
group by prefixo,cpf
having count(*) > 1
--
select taxi,nome_motorista , passageiro.nome
from taxi,passageiro,(select prefixo,cpf
from corrida
group by prefixo,cpf
having count(*) > 1) frequentes
where taxi,prefixo = frequente.prefixo
and passageiro.cpf = frequente.cpf
Creio ser isto (uma solução possíveL)
--d.Listar os prefixos dos taxis que não realizaram corridas tanto partindo do bairro 'Floresta' quanto do bairro 'Sao Joao'.
select Prefixo from Taxi where Prefixo not in (select Prefixo from Corrida where BairroDaPartida in ('Floresta','Sao Joao'));
--e.Listar os nomes dos passageiras e dos motoristas de taxis que realizaram corridas mais de uma vez juntos.
select Taxi.NomeMotorista , Passageiro.Nome from Taxi,Passageiro,(select Prefixo,CPF from Corrida group by Prefixo,CPF having count(*) > 1) Corrida where Taxi.Prefixo = Corrida.Prefixo and Passageiro.CPF = Corrida.CPF;
Pode crer essa foi a solução que pra mim estava impossível, muito obrigado, ainda chego nesse nível :ph34r:
>
Teste esse SQL. Caso de algum erro me informe.
SELECT c.prefixo, t.nomemotorista, p.nome, COUNT(c.id) AS qtd_corridas INTO #corridas
FROM corrida c, taxi t, passageiro p
WHERE (t.prefixo = c.prefixo AND p.cpf = c.cpf) AND c.prefixo NOT IN (
SELECT DISTINCT prefixo FROM corrida WHERE bairrodapartida IN('Floresta', 'Sao Joao','Higienopolis')
)
GROUP BY c.prefixo, t.nomemotorista, p.nome
SELECT * FROM #corridas WHERE qtd_corridas > 1
Wbpereir encontrei a solução com a ajuda do Motta, espero poder retribuir a atenção!
Caro tente utilizar o SQL abaixo:
SELECT c.prefixo, t.marca, t.nomemotorista FROM corrida c INNER JOIN taxi t ON t.prefixo = c.prefixo WHERE c.bairrodapartida NOT IN('Floresta', 'Sao Joao');
NOT IN: trás tudo que não contém os parametros passados.
INNER JOIN: é apenas para informar quais são os motoristas mas se quiser apenas o prefixo mesmo acaba sendo desnecessário.
Me avise se deu certo.