O QUE TEM DE ERRADO NESSE SELECT COM INNER JOIN?

POCE1DON 19/01/2017 00:41:40
#470833
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
KERPLUNK 19/01/2017 01:01:28
#470837
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?
POCE1DON 19/01/2017 01:40:42
#470839
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.
KERPLUNK 19/01/2017 03:08:11
#470840
é 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.
POCE1DON 19/01/2017 13:19:22
#470848
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 ?

JABA 19/01/2017 13:31:38
#470849
Coloque a estrutura de suas tabelas aí e nos diga o que precisa. Talvez possamos lhe dar uma consulta mais enxuta.
POCE1DON 19/01/2017 13:47:21
#470850
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 encerrado , respostas não são mais permitidas