Treinamentos Oracle - Nerv Informática

Comparar dados da mesma tabela.

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagempor nollries em Ter, 30 Mar 2010 12:08 am

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!
nollries
Localização: PR

Alysson

Mensagempor JLM em Ter, 30 Mar 2010 8:51 am

a principio podemos considerar a seguinte pesquisa :

Código: Selecionar todos
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:
JLM
Localização: Araraquara-SP

Mensagempor nollries em Ter, 30 Mar 2010 3:34 pm

Fala JML beleza?

primeiramente obrigado pela atenção!

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

valeu!

:arrow:
nollries
Localização: PR

Alysson

Mensagempor fsitja em Ter, 30 Mar 2010 5:39 pm

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.
fsitja
Localização: Gaúcho no Rio de Janeiro - RJ

"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Mensagempor nollries em Qua, 31 Mar 2010 1:11 am

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!!!
nollries
Localização: PR

Alysson

Mensagempor fsitja em Qua, 31 Mar 2010 11:46 am

nollries, fiz dois exemplos de select com formas diferentes de exibir relatório desse tipo:
Código: Selecionar todos
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        preco_comercial,
  6         g.preço        preco_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   PRECO_COMERCIAL    PRECO_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 preco_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  PRECO_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.
fsitja
Localização: Gaúcho no Rio de Janeiro - RJ

"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Mensagempor nollries em Qui, 01 Abr 2010 8:41 am

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.
nollries
Localização: PR

Alysson


Voltar para SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes