nollries, fiz dois exemplos de select com formas diferentes de exibir relatório desse tipo:
Selecionar tudo
SQL> create table produto (cod_produto number(10) primary key,
2 nome_produto varchar2(100) not null,
3 preço number(15, 2),
4 tipo_receita varchar2(30) check (tipo_receita in ('A',
5 'B',
6 'ESPECIAL',
7 'TALIDOMIDA',
8 'CONTROLE ESPECIAL')),
9 cod_med_comercial number(10) references produto (cod_produto));
Table created
SQL> begin
2 insert into produto values (1, 'PROD_X', 20.99, 'ESPECIAL', null);
3 insert into produto values (2, 'PROD_X1', 15.99, 'ESPECIAL', 1);
4 insert into produto values (3, 'PROD_X2', 13.99, 'A', 1);
5 insert into produto values (4, 'PROD_N', 9.99, null, null);
6 insert into produto values (5, 'PROD_N1', 7.99, null, 4);
7 commit;
8 end;
9 /
PL/SQL procedure successfully completed
SQL> SELECT p.cod_produto cod_comercial,
2 g.cod_produto cod_generico,
3 p.nome_produto nome_comercial,
4 g.nome_produto nome_generico,
5 p.preço preço_comercial,
6 g.preço preço_generico,
7 p.tipo_receita receita_comercial,
8 g.tipo_receita receita_generico
9 FROM produto p
10 JOIN produto g
11 ON g.cod_med_comercial = p.cod_produto
12 WHERE p.tipo_receita != g.tipo_receita
13 OR p.preço < g.preço;
COD_COMERCIAL COD_GENERICO NOME_COMERCIAL NOME_GENERICO preço_COMERCIAL preço_GENERICO RECEITA_COMERCIAL RECEITA_GENERICO
------------- ------------ -------------- ------------- ----------------- ----------------- ----------------- ----------------
1 3 PROD_X PROD_X2 20,99 13,99 ESPECIAL A
SQL> SELECT p.cod_produto,
2 p.nome_produto,
3 PRIOR p.nome_produto nome_com,
4 p.preço,
5 PRIOR p.preço preço_com,
6 p.tipo_receita,
7 PRIOR p.tipo_receita rec_com
8 FROM produto p
9 START WITH p.cod_med_comercial IS NULL
10 CONNECT BY PRIOR p.cod_produto = p.cod_med_comercial;
COD_PRODUTO NOME_PRODUTO NOME_COM preço preço_COM TIPO_RECEITA REC_COM
----------- ------------ -------- ----------------- ---------- ------------ ---------
1 PROD_X 20,99 ESPECIAL
2 PROD_X1 PROD_X 15,99 20,99 ESPECIAL ESPECIAL
3 PROD_X2 PROD_X 13,99 20,99 A ESPECIAL
4 PROD_N 9,99
5 PROD_N1 PROD_N 7,99 9,99
SQL>
Não dê bola para minha tabela de exemplo... é boba mesmo, só para testes.
O primeiro select faz um self-join para listar todos os medicamentos genéricos ao lado de seu equivalente comercial. Aí coloquei um filtro no where para selecionar os que tivessem diferença do atributo de tipo de receita e cujo preço do remédio genérico fosse mais caro do que o comercial (!)
O segundo faz um connect by (select hierárquico) para pegar todos remédios e abaixo deles listar seus genéricos, comparando os atributos. Dá para encapsular esse select numa subquery (ou view) para filtrar discrepâncias e outras coisas.
É um começo, se tiver sugestões ou correções para apontar, fique à vontade.