filtro em uma consulta

Amigos,
tenho a seguinte necessidade:
1 - uma consulta que possui a tabela Sintomas PK(#num_paciente, #data_consulta, #cod_doenca, #cod_sintoma)
2 - tenho um filtro com campo cod_sintoma (duplo select)

Regra do negócio. Uma DIAGNOSTICO (cod_doenca) pode ter um ou mais SINTOMAS(cod_sintoma)

3 - Problema: O SQL, montou perfeitamente a seleção dos registros. Quando chamo o filtro e seleciono vários sintomas o SC utiliza a “sc_select_where” colocando a condição IN para os sintomas que selecionei. Ocorre que a condição IN utiliza o operador OR e não o AND. Logo, se forem selecionados varios sintomas a query retorna todas as doenças que possuam pelo menos um dos sintomas e o que preciso é que todos os sintomas pertençam a uma só doença.
Ex. cod_doença cod_sintoma
01 11
15
20 11
15
67
se forem selecionados no duplo select os sintomas 11, 15, 67 somente a doença 20 pode ser retornada.

Abaixo a query com o exemplo acima

SELECT s.num_paciente, s.data_consulta, s.cod_doenca, d.descricao, p.nome, p.idade, p.sexo, p.nascimento
FROM ( SELECT s.num_paciente, s.data_consulta, s.cod_doenca
FROM sintomas s
WHERE s.cod_sintoma IN (11,15,67)) t1, paciente p, doenca d // os itens da condição IN devem vir do duplo select dinamicamente
WHERE p.num_paciente = t1.num_paciente
AND d.cod_doenca = t1.cod_doenca
GROUP BY num_paciente_diag_pat, dat_atend_diag_pat, cod_doenca_diag_pat
HAVING COUNT(*) = 3 // este número do count depende da quantidade de itens selecionados do duplo select preenchido por variavel

Explicando a query:
Só preciso saber como recuperar os itens selecionados dos sintomas no duplo select, contar quantos foram selecionados e como posso fazer para executar essa query. Pensei em iniciar pelo filtro a aplicação de consulta, como modal.
Aguardo.

jlmonteiro,

Porque você não monta o SELECT dos DUPLOS SELECT, separados?

Tem como você dizer a estrutura da Tabela Doença e Sintomas?

Leandro

Leandro, abaixo segue detalhadamente minha regra de negocio, o que fiz no SC , o que consigo realizar no SQL e o que preciso.

Bem, tenho a seguinte quadro:
A regra do negocio é, uma doença pode se configurar por pelo menos um ou mais sintomas ( 1:N ).

Estrutura das tabelas:
Doenças: #num_paciente, #data_consulta, #cod_doenca (todos campos PK)
Sintomas: #num_paciente, #data_consulta, #cod_doenca, #cod_sintoma (todos campos PK)

       DOENCAS 1:N SINTOMAS 

Aplicação:

  • Criei uma aplicação de Consulta para apresentar as doenças, utilizo uma query com a tabela principal SINTOMAS fazendo join com PACIENTES, DOENCAS com distinct. Criei um filtro por cod_sintomas utilizando um Duplo Select, no qual posso selecionar um ou mais sintomas. Pela regra do negócio a consulta tem que retornar as doenças que atendam a todos os sintomas selecionados no filtro.
    O que ocorre é que SC utiliza a concatenação do filtro (sc_select_where) colocando a condição IN na clausula where. Acontece que a condição IN utiliza o operador lógico OR e não o operador AND. O resultado é que a query retorna todas as doenças que possuem pelo menos um sintoma dos selecionados, por causa do operador OR. No exemplo abaixo na base de dados, retorna as doenças 01 e 20.

Exemplo dos dados cadastrados:
num_paciente data_consulta cod_doença cod_sintoma
100 10/05/2007 01 11
01 15

          64             05/12/2008            20                         11
                                                          20                         15
                                                          20                         67

Pela regra do negócio, se forem selecionados, no duplo select, os sintomas 11, 15, 67 somente a doença 20 pode ser retornada, pois só ela possui os 3 sintomas ao mesmo tempo.

Abaixo mostro a query que utilizando, a partir dos dados acima, que quando executo no SQL, retorna somente o cod_doença = 20 ( o correto para a regra do negócio).

SELECT s.num_paciente, s.data_consulta, s.cod_doenca, d.descricao, p.nome, p.idade, p.sexo, p.nascimento
FROM ( SELECT s.num_paciente, s.data_consulta, s.cod_doenca
FROM sintomas s
WHERE s.cod_sintoma IN (11,15,67)
) t1, paciente p, doenca d // Obs 1
WHERE p.num_paciente = t1.num_paciente
AND d.cod_doenca = t1.cod_doenca
GROUP BY num_paciente_diag_pat, dat_atend_diag_pat, cod_doenca_diag_pat
HAVING COUNT(*) = 3 // Obs 2

Explicando a query acima:
O 2º Select que fica dentro do From do Select principal (Obs 1), traz todas as doenças que possuam pelo menos um sintoma selecionado, então precisaria saber quais os códigos dos sintomas foram selecionados no filtro. Isso teria que ser dinâmico e substituído por uma variável (concatenando o cod_sintoma observando que o campo na tabela é numérico) ou varias variáveis numéricas também concatenadas para a condição IN.
A clausula Having (Obs 2) , no final da query principal, é a que seleciona somente os registros que atendem a regra do negocio. Então preciso saber quantos itens foram selecionados no filtro. Isso seria dinâmico e substituído por uma variável.

A aplicação consulta existente:

  • Na consulta que criei na pasta SQL, é montada uma query simples, com distinct referente as doenças. Quando a aplicação é executada a consulta traz todos os registros. Quando chamo o filtro e seleciono os sintomas, o SC concatena adicionando a clausula where o operador IN.

Necessidades na aplicação de consulta:
1 - Saber como recuperar os itens selecionados dos sintomas no duplo select, concatená-los;
2 - Contar quantos sintomas foram selecionados;
3 - Como posso fazer para adicionar dinamicamente na query, pois o usuário poderá não selecionar nenhum sintoma e mandar executar a pesquisa. (o que fazer com a query criada na pasta SQL da aplicação consulta, pois o SC utiliza para adicionar o filtro?).

Espero ter explicado com todos os detalhes. Se faltar alguma informação ou se precisar tirar alguma dúvida, é só postar aqui.

crie um view no banco de dados para este select e na consulta usa um select na view em vez deste select.