Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DecoST

Dificuldade com select

Recommended Posts

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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

D - tente com NOT EXISTS

 

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;

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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)

Compartilhar este post


Link para o post
Compartilhar em outros sites

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


Compartilhar este post


Link para o post
Compartilhar em outros sites
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:

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.