SELECT com campo "TMP_USUPET_NRO_PRONTUARIO" criado da SubQuery

(Amaro.coutinho) #1

Estou precisando criar uma consulta que tenha um campo que será gerado de uma Subquery, onde a mesma irá receber um parâmetro para trazer o contéudo desse campo, conforme exemplo abaixo.

SELECT A.CADUSU_seq_usuario,CADUSU_nome_usuario,
( SELECT Z.USUPET_NRO_PRONTUARIO
FROM USUPET_USUA_PRONT_ESTAB Z
WHERE Z.CADUSU_seq_usuario=A.CADUSU_seq_usuario
AND Z.CESTSA_seq_estab_saude=[CESTSA_seq_estab_saude]
) AS TMP_USUPET_NRO_PRONTUARIO
from CADUSU_CAD_USUARIOS A

Este select é gerado na consulta, mas o campo “TMP_USUPET_NRO_PRONTUARIO” sempre retorna vazio.

Tenho urgência nessa solução.

Agradeço aos que puderem ajudar.

Amaro Coutinho

(Antonio Jr.) #2

Prezado,

Não conheço seu modelo de dados, mas já verificou se a variável [CESTSA_seq_estab_saude] recebe algum valor válido para sua subquery?

Tenta rodar a subquery com o [CESTSA_seq_estab_saude] esperado pra se certificar que está tudo ok.

Conta aí o resultado.

Abraços,
Antonio Júnior
27-8859-2466

(Amaro.coutinho) #3

Prezado Antonio Junior,

Primeiramente obrigado pelo interesse no erro. Segue abaixo o SELECT e o erro gerado quando está gerando o fonte:

======= SELECT ===========

select CADUSU_cpf,CADUSU_STATUS,CADUSU_sexo,CADUSU_DT_CADASTRAMENTO,
A.CADUSU_seq_usuario,
CADUSU_nome_usuario ,
( SELECT Z.USUPET_NRO_PRONTUARIO
FROM USUPET_USUA_PRONT_ESTAB Z
WHERE Z.CADUSU_seq_usuario=A.CADUSU_seq_usuario
AND Z.CESTSA_seq_estab_saude=17
) AS TMP_USUPET_NRO_PRONTUARIO
from CADUSU_CAD_USUARIOS A

Obs.: Não usuei a variável [CESTSA_seq_estab_saude], forcei um valor e o erro persite. O campo que recebe a variável é do tipo inteiro.

======= ERRO AO FINAL DA GERAÇÃO DO CÓDIGO FONTE===========
ERRO
Erro ao acessar o banco de dados
Dynamic SQL Error SQL error code = -104 Token unknown - line 1, char 23 select
select count(*) from (select A.CADUSU_cpf,A.CADUSU_STATUS,A.CADUSU_sexo,A.CADUSU_DT_CADASTRAMENTO, A.CADUSU_seq_usuario, CADUSU_nome_usuario , ( SELECT Z.USUPET_NRO_PRONTUARIO FROM USUPET_USUA_PRONT_ESTAB Z WHERE Z.CADUSU_seq_usuario=A.CADUSU_seq_usuario AND Z.CESTSA_seq_estab_saude=17 ) AS TMP_USUPET_NRO_PRONTUARIO from CADUSU_CAD_USUARIOS A) nm_sel_esp

(Amaro.coutinho) #4

Prezado Antonio Junior,

Só um detalhe, se defino uma VIEW, conforme abaixo, funciona. Só que não posso fazer por VIEW, porque preciso selecionar o campo de acordo com a variável [CESTSA_seq_estab_saude].

create view VIEW_VSUBQUERY
(CADUSU_DT_CADASTRAMENTO,
CADUSU_seq_usuario,
CADUSU_nome_usuario ,
TMP_USUPET_NRO_PRONTUARIO
)
AS
select CADUSU_DT_CADASTRAMENTO,
A.CADUSU_seq_usuario,
CADUSU_nome_usuario ,
( SELECT Z.USUPET_NRO_PRONTUARIO
FROM USUPET_USUA_PRONT_ESTAB Z
WHERE Z.CADUSU_seq_usuario=A.CADUSU_seq_usuario
AND Z.CESTSA_seq_estab_saude=17
) AS TMP_USUPET_NRO_PRONTUARIO
from CADUSU_CAD_USUARIOS A

Obrigado,

Amaro Coutinho

(Antonio Jr.) #5

Amaro, blz?

Uso muito subquerys, mas tenho que garantir que ela retorne um único registro.

Pela mensagem, parece erro de interpretação no SC porque algum campo está como nome errado ou não conseguiu “entender” o SQL.

Tenta:

  1. Rodar a query pelo Query Builder do SC;
  2. Colocar espaços entre as vírgulas e simbolos de igual (=).

Conta aí o resultado.

Abraços,
Antonio Júnior
27-8859-2466

(Amaro.coutinho) #6

Caro Antonio Júnior,

Seguindo sua orientações:

  1. Rodar a query pelo Query Builder do SC;

    Fiz o teste no Query Builder do SC e funcionou, mas quando levo este mesmo select para a minha consulta gera o erro.

“select CADUSU_nome_usuario ,
( SELECT max(Z.USUPET_NRO_PRONTUARIO)
FROM USUPET_USUA_PRONT_ESTAB Z
WHERE Z.CADUSU_seq_usuario=A.CADUSU_seq_usuario
AND Z.CESTSA_seq_estab_saude = 17
) as TMP_USUPET_NRO_PRONTUARIO
from CADUSU_CAD_USUARIOS A”

obs.: Não puder usar variável.
A Subquery só retorno um valor

    1. Colocar espaços entre as vírgulas e simbolos de igual (=).
      Não entendi

Se não for pedir muito, você tem como fazer um teste em duas tabelas (ex:“PEDIDO” e “ITENS”) para ver se funciona.
Terá que listar o NroPedido e Data da Tabela “PEDIDO” e ultimo CodItem da Tabela “ITENS”. Assim estará simulando a subquery que estou fazendo.
Tabela PEDIDO
NroPedido
Data
Tabela ITENS
NroPedido
CodItem

ex:
SELECT A.NroPedido,
A.Data,
( SELECT MAX(B.CodItem)
FROM ITENS B
WHERE B.NroPedido = A.NroPedido
) AS MaiorCodItem

FROM PEDIDO A

(Antonio Jr.) #7

Amaro, tudo bem?

As minhas sugestões foram baseadas na mensagem de erro que vc mencionou, pois parece que seu banco de dados, acho que é Firebase ou Firebird, não encontrou coincidência entre o nome do campo (ou tabela) do seu SQL com o que realmente está implementado (físico).

Ainda nessa linha de raciocínio. Você possui bases de dados diferentes? Isto é, uma base de teste e/ou outra de produção? Caso sim, suas estruturas estão iguais?

Não vejo erro/problema na montagem das querys, tanto na sua, quanto na sugerida para teste, mas o erro indica que algo não está casando.

Outras sugestões:

  1. Nome da tabela: verifique se o banco faz distinção entre nomes maísculos e minúsculo, então sua query ficariam SELECT FROM <tabela com nome minúsculo> …

  2. Conexão no SC: verifique se a conexão usada aponta para a base de dados com a estrutura correspondente à sua query.

  3. Maiúsculas X Minúsculas: verifique se seu banco de dados permite ou entende essas misturas.

Conta aí qual foi o resultado.

Abraços,
Antonio CP Júnior
27-8859-2466

(Amaro.coutinho) #8

Prezado Antonio Jr,

Estou usando o Firebird, o banco de dados é de teste, pois estou iniciando um projeto no scriptcase e estou testando as minhas necessidades, e uma delas é essa subquery. Já testei a questão de Maiúsculas X Minúsculas, não faz diferença.
O que está me intrigando é que depois que você me orientou a testar no Query Builder, fiz o teste e funciona, mas na consulta não funciona, conforme relatei.

Se você per permitir envio para o seu email um banco em firebird com as duas tabelas, cada uma com dez registros; e mando o projeto somente com a consulta em forma de backup para você verificar.

Vou fazer um teste com outro banco de dados (SQLServer), caso funcione vou conluir que é um bug especifico com Firebird.

Atenciosamente,

Amaro Coutinho

(Antonio Jr.) #9

Amaro, cara!

Não tenho Firebird. Experimente usar MySQL, que é bem mais leve que o SQL Server.
Agora em relação a

Já testei a questão de Maiúsculas X Minúsculas, não faz diferença
, dependendo do ambiente e configuração do banco, o nome de tabelas em maíusculo e minúsculo é considerado distinto. Isto é, para funcionar deve ser declarado no SQL exatamente como está implementado fisicamente.

Manda aí a estrutura das tabelas envolvidas para que eu possa avaliar. Faça uma extração da estrutura das tabelas a partir do seu banco de dados. Assim teremos uma visão exata de como estão implementadas.

Abraços,
Antonio Júnior
27-8859-2466

(Antonio Jr.) #10

Amaro,

Verifiquei primeiramente sua estrutura, então seguem minhas sugestões destacadas em vermelho:

SELECT
A.CADUSU_SEQ_USUARIO,
A.CADUSU_NOME_USUARIO,
(SELECT
Z.USUPET_NRO_PRONTUARIO
FROM
USUPET_USUA_PRONT_ESTAB Z
WHERE
Z.CADUSU_SEQ_USUARIO = A.CADUSU_SEQ_USUARIO AND
Z.CESTSA_SEQ_ESTAB_SAUDE=[VAR_CESTSA_seq_estab_saude]
) AS TMP_USUPET_NRO_PRONTUARIO
from CADUSU_CAD_USUARIOS A

  • Colocar tudo em maíusculo, conforme estrutura, e diferenciar o nome da variável que recebe parâmetro do nome do campo da tabela.

Caso ainda não funcione, diz aí, para eu criar uma base de dados com essas tabelas e testar.

Abraços,
Antonio Júnior
27-8859-2466