O QUE TEM DE ERRADO NESSE SELECT COM INNER JOIN?

 Tópico anterior Próximo tópico Novo tópico

O QUE TEM DE ERRADO NESSE SELECT COM INNER JOIN?

SQL / DATABASE

 Compartilhe  Compartilhe  Compartilhe
#470833 - 19/01/2017 00:41:40

POCE1DON
GOIANIA
Cadast. em:Julho/2010


Montei assim:
  
SELECT PG.idpagamento, PG.valor, VE.data, TMP.usuario
FROM tblPagamento PG INNER JOIN (SELECT PG.idpagamento, VE.data, (SELECT nome FROM tblUsuario WHERE idusuario = PG.idusuario) AS usuario
                                      FROM tblPagamento PG INNER JOIN tblVenda VE ON PG.idvenda = VE.idvenda) TMP ON PG.idpagamento = TMP.idpagamento


O erro
Citação:
[Microsoft][ODBC Microsoft Access Driver] Jet error -3030
está sendo retornado quando faço o SELECT de
Citação:
TMP.usuario


Se eu fizer apenas esse SELECT
  SELECT PG.idpagamento, VE.data, (SELECT nome FROM tblUsuario WHERE idusuario = PG.idusuario) AS usuario
                                 FROM tblPagamento PG INNER JOIN tblVenda VE ON PG.idvenda = VE.idvenda


funciona normalmente. Mas quando faço o JOIN pra pegar o nome do usuário, acontece o erro.

Eu quero fazer o SELECT de TMP.usuario validando seu nome, porque pode acontecer do usuário não estar mais cadastrado...
  SELECT PG.idpagamento, PG.valor, IIF(ISNULL(TMP.usuario) = FALSE, TMP.usuario, 'desconhecido') FROM tblPagamento PG



Por favor, vc pode me ajuda?
Vlw



#470837 - 19/01/2017 01:01:28

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
O campo "usuario", deveria estar na tabela tblUsuario que tem o alias de "usuario". O alias TMP se refere à tabela tblVenda. Então ao invés de "TMP.usuario", não deveria ser "usuario.usuario" na primeira linha onde você seleciona os campos?

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#470839 - 19/01/2017 01:40:42

POCE1DON
GOIANIA
Cadast. em:Julho/2010


 Anexos estao visíveis somente para usuários registrados

O select que faço de 'nome' em tblUsuario, e crio o alias usuario, é só um sub select para que em todos os pagamentos eu
fique sabendo qual usuário realizou. O alias TMP, criei na tabela virtual que gero selecionando os
códigos dos pagamentos com base só nas vendas que existir algum pagamento.

Agora não entendi como era pra ser 'usuario.usuario'...

Coloquei o banco de teste anexado aqui, vamos ver se consigo explicar melhor o problema.




#470840 - 19/01/2017 03:08:11

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
É que "TMP.usuario", se refere ao campo de nome "usuario" na tabela tblVendas. Esse campo existe nessa tabela? Mas eu faria uma seleção diferente:

SELECT PG.idpagamento, PG.valor, VE.data, TMP.usuario, (SELECT nome FROM tblUsuario WHERE idusuario = PG.idusuario) AS usuario
FROM tblPagamento PG, tblVenda TMP
WHERE PG.idvenda = VE.idvenda AND PG.idpagamento = TMP.idpagamento

Acho que assim fica mais simples e mais clara.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#470848 - 19/01/2017 13:19:22

POCE1DON
GOIANIA
Cadast. em:Julho/2010


Última edição em 19/01/2017 13:19:50 por POCE1DON

Seu select ficou com o mesmo desempenho do meu com "join", mas também não consegui fazer a validação do usuário
no select.

Eu quero aplicar um "filtro" para que me retorne apenas os registros que ainda existir usuários cadastrados, por isso
fiz o sub select do usuário e depois tento ver se ele é válido.

O sub select
(SELECT nome FROM tblUsuario WHERE idusuario = PG.idusuario)
, criei
o alias "usuario" pra ele.

O que pude perceber com seu select, é que se eu não converter o código do usuário para INT, a seleção
não é feita, já que eu pego o código no campo "data", que é uma string "data#código" na tabela "tblPagamento".

Como vou exibir o usuário como 'desconhecido' se não fizer esse sub select? .. ou aplicar um 'WHERE ISNULL(TMP.usuario) = FALSE ?





#470849 - 19/01/2017 13:31:38

JABA
CABO FRIO
Cadast. em:Agosto/2005


Coloque a estrutura de suas tabelas aí e nos diga o que precisa. Talvez possamos lhe dar uma consulta mais enxuta.

_______________________________________________________________________________________________

Se a alma ou espírito são imateriais, como eles fazem para se localizarem quando o corpo está em movimento?



#470850 - 19/01/2017 13:47:21

POCE1DON
GOIANIA
Cadast. em:Julho/2010


Última edição em 19/01/2017 13:48:19 por POCE1DON

Citação:
:
Coloque a estrutura de suas tabelas aí e nos diga o que precisa. Talvez possamos lhe dar uma consulta mais enxuta.


tblPagamento: idpagamento, idvenda, valor, cadastro (data#código do usuário que lançou)
tblUsuario: idusuario, nome, cadastro, removido
tblVenda: idvenda, idusuario, tipo, data

Amigo Jaba, na segunda resposta está anexado o BD teste com esse estrutura.

O problema está na exibição do nome do usuário de 'tblUsuario', conforme o código registrado em 'cadastro' da tabela 'tblPagamento'

Vlw




 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por POCE1DON em 20/01/2017 00:56:51