Ir para conteúdo

POWERED BY:

Arquivado

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

Digows

[Resolvido] Retornando todas linhas com OUTER JOIN.

Recommended Posts

Olá,

 

Estou trabalhando com uma base não normalizada e estou tentando fazer com que meu OUTER JOIN retorne todas linhas da tabela da direita.

 

Consegui realizar isso através das condições no where, porém isso limita a quantidade de linhas retornadas na query, preciso de uma query com todas linhas, dessa forma o SQL SERVER não mostra que um registro, que antes continha null quando especificado somente ele na condição, têm uma linha não atendida pela condição de RIGHT OUTER JOIN.

 

Segue uma simulação:

 

Simulação

 

CREATE DATABASE [DbTeste]

 

USE DbTeste

CREATE TABLE Alunos (

COD_COORDENADORIA float,

COORDENADORIA nvarchar(255),

ALUNO nvarchar(255),

COD_ANO float,

ANO nvarchar(255),

RP1 float,

RP2 float )

 

CREATE TABLE RESPOSTAS (

COD_PERGUNTA nvarchar(255),

COD_RESPOSTA float,

RESPOSTA nvarchar(255), )

 

INSERT INTO Alunos values (1,'COOR UM','José',5,'5º EF',0,2);

INSERT INTO Alunos values (1,'COOR UM','Manuel',5,'5º EF',1,1);

INSERT INTO Alunos values (2,'COOR DOIS','Carlos',5,'5º EF',0,0);

INSERT INTO Alunos values (2,'COOR DOIS','Maria',8,'8º EF',1,1);

INSERT INTO Alunos values (2,'COOR DOIS','Carol',8,'8º EF',0,2);

INSERT INTO Alunos values (2,'COOR DOIS','Fernando',8,'8º EF',1,1);

 

INSERT INTO RESPOSTAS values ('RP1',0,'Label da resposta RP1-0');

INSERT INTO RESPOSTAS values ('RP1',1,'Label da resposta RP1-1');

INSERT INTO RESPOSTAS values ('RP2',0,'Label da resposta RP2-0');

INSERT INTO RESPOSTAS values ('RP2',1,'Label da resposta RP2-1');

INSERT INTO RESPOSTAS values ('RP2',2,'Label da resposta RP2-2');

 

A seguinte query retorna todos os dados que preciso, inclusive a informação da ausencia de uma reposta pra questão RP1.

 

SELECT * FROM (

SELECT RP2, COUNT(RP2) as Frequencia,COD_COORDENADORIA,COD_ANO

FROM Alunos

WHERE COD_COORDENADORIA = 1 and COD_ANO = 5

GROUP BY RP2,COD_COORDENADORIA,COD_ANO) A

RIGHT OUTER JOIN Respostas R on R.COD_RESPOSTA = A.RP2

WHERE R.COD_PERGUNTA = 'RP2'

ORDER BY COD_COORDENADORIA,COD_RESPOSTA,COD_ANO

 

RESULTADO:

 

RP2 Frequencia COD_COORDENADORIA COD_ANO COD_PERGUNTA COD_RESPOSTA RESPOSTA

NULL NULL NULL NULL RP2 0 Label da resposta RP2-0

1 1 1 5 RP2 1 Label da resposta RP2-1

2 1 1 5 RP2 2 Label da resposta RP2-2

 

Mas eu tive que especificar que eu queria retornar somente uma COORDENADORIA e um ANO, preciso de todos anos e coordenadorias, assim alterei a query removendo o primeiro WHERE e a primeira linha que deveria ser retornada sumiu pois a resposta 0 que antes não existia, agora existe mas em outro caso, que é de uma coordenadoria diferente.

 

RP2 Frequencia COD_COORDENADORIA COD_ANO COD_PERGUNTA COD_RESPOSTA RESPOSTA

1 1 1 5 RP2 1 Label da resposta RP2-1

2 1 1 5 RP2 2 Label da resposta RP2-2

0 1 2 5 RP2 0 Label da resposta RP2-0

1 2 2 8 RP2 1 Label da resposta RP2-1

2 1 2 8 RP2 2 Label da resposta RP2-2

 

Como eu poderia especificar que pra cada coordenadoria eu quero um RIGHT OUTER JOIN da tabela RESPOSTAS?

 

Estou otimizando o processamento da minha aplicação na execução dessa query, já que da forma atual, tenho que filtrar ou executar novamente a query para retornar a informação de que aquela coordenadoria e ano não obteve nenhuma resposta de código 0. Fazendo através de comparação com uma segunda tabela que me informa todas as possibilidades de reposta não é a melhor forma.

 

Aqui vai um exemplo de oque eu gostaria que fosse retornado para mim:

 

RP2 Frequencia COD_COORDENADORIA COD_ANO COD_PERGUNTA COD_RESPOSTA RESPOSTA

 

NULL NULL NULL NULL RP2 0 Label da resposta RP2-0

1 1 1 5 RP2 1 Label da resposta RP2-1

2 1 1 5 RP2 2 Label da resposta RP2-2

0 1 2 5 RP2 0 Label da resposta RP2-0

1 2 2 8 RP2 1 Label da resposta RP2-1

2 1 2 8 RP2 2 Label da resposta RP2-2

 

Já que não há nenhum registro de cod_resposta 0 pra coordenadoria de codigo 1 e um ano qualquer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já resolvi, demorei um pouco mas foi.

 

Ficou assim, caso alguem se interessar pelo problema:

 

*****************************************************************************

SELECT * FROM (

SELECT * FROM (

SELECT RP_003_ALN_09, COUNT(RP_003_ALN_09) as Frequencia, COD_REDE, COD_ZONA

FROM Alunos

GROUP BY RP_003_ALN_09, COD_REDE, COD_ZONA) A

RIGHT JOIN Respostas R on R.COD_RESPOSTA = A.RP_003_ALN_09

WHERE R.COD_PERGUNTA = 'RP_003_ALN_09'

) TMP

RIGHT OUTER JOIN

(select * from (

select distinct K.COD_REDE,Cross_A.COD_ZONA from Alunos K

cross join (select distinct K.COD_ZONA from Alunos K) Cross_A

) tmp1

cross join(select * from Respostas R1 where R1.COD_PERGUNTA = 'RP_003_ALN_09') seila) ABC

on ABC.COD_REDE = TMP.COD_REDE and ABC.COD_ZONA = TMP.COD_ZONA and ABC.COD_RESPOSTA = TMP.COD_RESPOSTA

order by ABC.COD_REDE,ABC.COD_ZONA,ABC.COD_RESPOSTA

*****************************************************************************

 

Incrivel a velocidade que está rodando http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

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.