Página 1 de 1

Comparar dados da mesma tabela.

Enviado: Ter, 30 Mar 2010 12:08 am
por nollries
Olá amigos,

sou novo aqui no fórum e também no SQL...

bom, preciso fazer a seguinte comparação. Tenho uma tabela de produtos e preciso comparar se o produto A tem as mesmas informações preenchidas assim como no produto B e quais são elas, algo parecido.

Agradeço desde já

valeu!

Enviado: Ter, 30 Mar 2010 8:51 am
por JLM
a principio podemos considerar a seguinte pesquisa :

Selecionar tudo

 SELECT * FROM PRODUTO T1, PRODUTO T2
            WHERE T1.CODPRO <> T2.CODPRO
                AND (T1.COLUNA1 = T2.COLUNA1   OR
                         T1.COLUNA2 = T2.COLUNA2   OR
                         T1.COLUNA3 = T2.COLUNA3   OR
                         ..... )
:wink:

Enviado: Ter, 30 Mar 2010 3:34 pm
por nollries
Fala JML beleza?

primeiramente obrigado pela atenção!

... vou tentar aplicar esta solução que v. indicou e retorno com os resultados...

valeu!

:arrow:

Enviado: Ter, 30 Mar 2010 5:39 pm
por fsitja
A definição do que você precisa está meio vaga... de repente com algo mais pontual dê para sugerir algo mais específico para sua necessidade.

Enviado: Qua, 31 Mar 2010 1:11 am
por nollries
Bom dia fsitja,

realmente,

bom então é o seguinte.

tenho uma tabela de produtos (medicamentos) onde o medicamento comercial tem informado em seu cadastro o seu correspondente genérico que também é cadastrado na mesma tabela e tem seu correspondente comercial informado. Partindo disso, em algumas situações chamo o medicamento comercial porém utilizo o seu genérico, e vice versa, para fins de movimentação de estoque, cobrança etc. Em alguns casos os dois cadastros devem ser exatamente iguais outrora não, dai preciso comparar os medicamentos (comercial X genérico) afim de identificar diferenças nos cadastros e de preferência quais campos estão informados em um e no outro não e/ou que informação tem no campo A do comercial e o que tem no campo A do genérico.

... Agradeço a informação do amigo JML, porém ainda não consegui adaptar ao que preciso.

Bom, acredito que com estas informações acima seja possível entender melhor a situação.

Agradeço a força!!!

Enviado: Qua, 31 Mar 2010 11:46 am
por fsitja
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 (!) :lol:

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.

Enviado: Qui, 01 Abr 2010 8:41 am
por nollries
Bom dia pessoal,

valeu fsitja pelo código, vou dar uma olhada e ver o que eu consigo. Provavelmente só consiga responder no final de semana - os últimos dias estão punk :-o na facul e no trabalho ... - mais pelo que analisei com certeza vai ajudar muito.

retorno assim que possível, valeu!!!

Até mais.