Eu tenho uma tabela que contém informações dos funcionários. Esta tabela mostra toda a hierarquia de funcionários. Um determinado funcionário pode estar em qualquer nível da hierarquia. Se eu quiser saber um determinado atributo de um funcionário específico, posso escrever minha instrução SQL usando a cláusula where
where '[email protected]' in ANY(manager_3, manager_4, manager_5, manager_6, employee_email)
Isso funciona bem. O desafio é quando tenho vários funcionários (que podem ou não ser gestores). Não consigo alterar a estrutura da tabela. O resultado final da minha consulta é listar todas as pessoas individuais que estão na cadeia hierárquica de 1 ou mais funcionários. Suponha que eu tenha 3 pessoas. Não sei em que nível da hierarquia eles estão. Preciso encontrar todos que se reportam a essas 3 pessoas na hierarquia. O que preciso fazer é algo semelhante a isto (e sei que isso NÃO é SQL válido)...
select employee_email from myTable
where ('[email protected]', '[email protected]', '[email protected]') =
Any(manager_3, manager_4, manager_5, manager_6, employee_email)
Existe uma maneira mais limpa/ideal de escrever isso usando três cláusulas ANY separadas?
**** EDIT ***** Só para quem pesquisar isso mais tarde, acabei usando o SUB_QUERY listado na resposta, mas em vez de fazer várias consultas do DUAL, usei uma rotina dividida ...
WITH
Q_STR AS (SELECT 'YOUR,COMMA,SEPARATED,STRING' STR FROM DUAL)
SELECT
TRIM(COLUMN_VALUE) COL1
FROM Q_STR,
XMLTABLE(('"' || REPLACE(STR, ',', '","') || '"'));
Usar
OR
:ou:
ou junte-se a uma cláusula de fatoração de subconsulta contendo os valores desejados:
ou combine os dois anteriores usando
EXISTS
(em vez deIN
):