Jump to content
agent369

[Resolvido] SQL query retornar campo de outra tabela

Recommended Posts

agent369

Boas, então é assim, tenho aqui uma query para mostrar os dados dos trabalhadores.

e tive de altera-la e passar a usar um "case" no meio, isto porque precisava de ir ver primeiro à tabela de avaliações se existia um registo para aquele funcionário, se não houver é que mostra o registo da própria tabela (não sei se me faço entender bem)

e para isso tenho a query em baixo que funciona perfeitamente.

A minha dúvida é se não há maneira de trocar a parte a negrito pelo campo "w_evaluation_score" que era o campo que eu queria retornar, mas quando o ponho no then ele dá erro que o campo não existe na tabela, e se eu no from adicionar a tabela "w_evaluation" ele deixa de dar erro mas retorna dados repetidos e todos trocados.

Obrigado

QUERY:

SELECT worker_id, worker_name as 'Nome', worker_email as 'E-Mail', worker_dt_contact as 'Data Contacto', worker_dt_exam as 'Data Exame',

CASE
WHEN (SELECT w_evaluation_score from w_evaluation WHERE w_evaluation_worker_id = worker_id and w_evaluation_state_id = 0)
THEN ([b]SELECT w_evaluation_score from w_evaluation WHERE w_evaluation_worker_id = worker_id and w_evaluation_state_id = 0[/b])
ELSE worker_score
END AS 'Nota',

worker_vca as 'VCA', worker_certificate as 'Certificados', worker_obs as 'Observações' FROM worker where worker_type = 4 and worker_state_id = 0

Edited by Rechousa
Formatação do código

Share this post


Link to post
Share on other sites
Rechousa

Olá,

É SQL Server?

Será que assim funciona? Estou a fazer um LEFT JOIN (imaginando que só tem uma avaliação) e, se não existir o registo em w_evaluation (vai ser nulo), então mostra o campo worker_score

SELECT worker_id,
   worker_name as 'Nome',
   worker_email as 'E-Mail',
   worker_dt_contact as 'Data Contacto',
   worker_dt_exam as 'Data Exame',
   ISNULL(w_evaluation_score, worker_score) AS 'Nota',
   worker_vca as 'VCA',
   worker_certificate as 'Certificados',
   worker_obs as 'Observações'
FROM worker
LEFT JOIN w_evaluation ON w_evaluation_worker_id = worker_id and w_evaluation_state_id = 0
WHERE worker_type = 4
   AND worker_state_id = 0

Espero ter ajudado,


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
agent369

Obrigado, funciona perfeitamente, tive apenas de trocar "ISNULL" por "IFNULL".

Não quero ser chato mas e no caso de haver mais que um registo (o que é o caso). tinha pensado em fazer uma sub-query dentro do left join, mas há alguma maneira mais simples?

EDIT: já tinha feito também com um group by no fim, o meu problema é receber o ultimo registo daquele funcionário

Edited by agent369

Share this post


Link to post
Share on other sites
agent369

Assim de repente não estou a ver, acho que a solução que precisas é da sub-query dentro do left join.

Avisa se precisares de mais ajuda

Pois foi o que pensei, muito obrigado ;)

aproveito e deixo aqui a query pode ser que alguém precise.

SELECT worker_id,
worker_name AS 'Nome',
worker_email AS 'E-Mail',
worker_dt_contact AS 'Data Contacto',
worker_dt_exam AS 'Data Exame',
IFNULL(w_evaluation_score, worker_score) AS 'Nota',
worker_vca AS 'VCA',
worker_certificate AS 'Certificados',
worker_obs AS 'Observações'
FROM worker
LEFT JOIN (SELECT * FROM w_evaluation order by w_evaluation_id DESC limit 1) AS T1
ON w_evaluation_worker_id = worker_id AND w_evaluation_state_id = 0
WHERE worker_type = 4
AND worker_state_id = 0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.