PROBLEMAS NA CONSULTA SQL

SERGIOPASCOAL 13/08/2013 17:50:05
#427493
Pessoal tenho uma dúvida, estou fazendo uma consulta sql e aparece um erro:
Erro de sintaxe (operador faltando) na expressão de consulta....

minha sql:
Select Pacientes.*, Categorias.descricao as nomecategoria, Profissionais.nome as nomeprofissional From Pacientes INNER JOIN Categorias on (Categorias.codigo = Pacientes.categoria) INNER JOIN Profissionais on (Profissionais.codigo = Pacientes.profissional) where Pacientes.ativo = True

onde tenho a tabela

Pacientes:
id (auto numeração)
nome (string)
categoria (numero)
profissional (numero)

Categorias:
codigo (numero)
descricao (string)

Profissionais
codigo (numero)
nome (string)


eu quero uma lista dos pacientes (tabela Pacientes) aparecendo os nomes da categoria e profissionais (mas aparece esse erro)

Agradeço qualquer ajuda
Obrigado
SAMUKA 13/08/2013 18:15:54
#427495
Embora você não tenha listado, acredito que sua tabela Pacientes, tem o campo Ativo que você usa no Where.
Então, tente fazer a seguinte mudança:

SELECT Pacientes.*, Categorias.descricao as nomecategoria, Profissionais.nome as nomeprofissional
From (Pacientes LEFT JOIN Categorias ON Pacientes.categoria = Categorias.codigo)
LEFT JOIN Profissionais ON Pacientes.profissional = Profissionais.codigo
WHERE Pacientes.ativo = True


MARCELO.TREZE 13/08/2013 22:20:16
#427499
geralmente este erro acontece pelo seguinte motivo, veja bem: tudo que vem depois do WHERE deve existir antes do FROM, então se ajuda do colega acima não resolver tente isso

Select Pacientes.*, [txt-color=#0000f0]Categorias.Codigo[/txt-color], Categorias.descricao as nomecategoria, [txt-color=#0000f0]Profissionais.codigo[/txt-color],Profissionais.nome as nomeprofissional From Pacientes INNER JOIN Categorias on (Categorias.codigo = Pacientes.categoria) INNER JOIN Profissionais on (Profissionais.codigo = Pacientes.profissional) where Pacientes.ativo = True


bom repare que em azul estão os campos que faltaram.

ps: (Pacientes.*) significa que todos campos serão utilizados.

SAMUKA 13/08/2013 22:29:26
#427500
MARCELO-TREZE, sua informação está incorreta, pelo menos não é isso que diz o padrão SQL.

Você pode utilizar qq campo que esteja nas tabelas relacionadas no FROM, não precisa obrigatoriamente estar presente no SELECT. No SELECT apenas campos que irão ser retornados.
MARCELO.TREZE 13/08/2013 22:45:15
#427503
Certo entendi, ainda assim no caso dele os campos deverão ser inseridos pois se encontram nas comparações, ou esta afirmativa também não é correta?
SAMUKA 13/08/2013 22:56:40
#427504
Resposta escolhida
Também nesse caso não é necessário.
Não manjo de todos os SGDB, mas o padrão SQL-ANSI diz não ser obrigatório.
MARCELO.TREZE 13/08/2013 23:00:08
#427505
Bom fica ai a minha dica peço ao colega que tem a duvida que a teste.

Obrigado Samuka pelas dicas.

SAMUKA 13/08/2013 23:09:58
#427506
MARCELO-TREZE, magina. Já ralei muito com isso ... hoje começo a tirar alguns proveitos, de consultas com GroupBy, sub-consultas, essa maluquice toda.

SERGIOPASCOAL, só uma dica, se estiver em fase de criação do banco, aconselho a colocar o nome do campo (chave estrangeira) igual ao nome da chave primária.

Segue um exemplo de como poderia nomear as tabelas e os campos, pra ficar fácil de entender:

tbPacientes:
PacienteID (auto numeração) <<-- (PK) Chave Primaria
nome (string)
CategoriaID (numero) <<-- (FK) Chave Estrangeira
ProfissionalID (numero) <<-- (FK) Chave Estrangeira
ativo(boleano)

tbCategorias:
CategoriaID (numero) <<-- (PK) Chave Primaria
descricao (string)

tbProfissionais
ProfissionalID (numero) <<-- (PK) Chave Primaria
nome (string)

PK = Primary Key (Chave Primária)
FK = Foreign Key (Chave Estrangeira)
SERGIOPASCOAL 14/08/2013 14:08:09
#427540
Pessoal muito obrigado resolveu meu problema, agradeço a todos Samuka sua instrução funcionou...
Tópico encerrado , respostas não são mais permitidas