- Este tópico contém 16 respostas, 3 vozes e foi atualizado pela última vez 15 anos, 8 meses atrás por
diegolenhardt.
-
AutorPosts
-
16 de junho de 2010 às 5:24 pm #94598
Maths
ParticipanteGalera, é meio simples, sou noob ainda, sou novo na area, estou trabalhando a 2 meses.. trabalho com SLM, (gerenciamento de nivel de serviço) utilizo programas que criam fluxo de dados manipulando por fundo banco oracle.. porem eu faço tudo pela aplicação que é 100% interativa, mas tem casos como o meu agora que eu preciso acessar o banco diretamente e manipular ele por lá ou criar programinhas e talz..
Meu problema é o seguinte.. eu tenho 2 tabelas, posso ver elas por excel ou .csv(bloco de notas) a tabela A contem 8074 registros e a B 8067, as duas SAO IDENTICAS, porem a B contem poucos registros a menos como voceis podem ver, meu chefe estava com esse problema e pediu minha ajuda, ele queria saber o seguinte “TUDO QUE HÁ DE DIFERENTE ENTRE AS DUAS TABELAS” porem galera cada uma tem 8mil registros, só que ai tem o grande problemas, alguns registros estao corrompidos, por exemplo, na coluna “START_TIME” das duas que seria a primary key contem apenas as datas, mas vamos supor, no registro 574 da tabela A em vez de uma data ali tem um CARACTER, a coluna descrição no lugar da start_time entendem? alguns dados estao bagunçados, um exemplo:
Start Time;End Time;Ano End;Ano Start;Ano Sysdate;
01/11/2009 00:25;01/11/2009 00:26;2009;2009;2010
01/11/2009 00:25;01/11/2009 00:26;2009;2009;2010
03/11/2009 13:34;03/11/2009 13:35;2009;2009;2010
08/11/2009 02:44;09/11/2009 09:01;2009;2009;2010
09/11/2009 03:06;09/11/2009 03:22;2009;2009;2010
“bvsp VPN VPN – NOVA FUTURO DTVM – SP – router
09/11/2009 17:00;11/11/2009 08:00;2009;2009;2010
09/11/2009 22:31;10/11/2009 09:00;2009;2009;2010
“CHAMADO REC 972807″””;PLANNER CORRETORA DE VALORES
16/11/2009 09:38;16/11/2009 12:00;2009;2009;2010Entenderam?? Isso é uma amostra da tabela A, peguei as 5 primeiras colunas, sendo que a tabela tem mais de 30 colunas, podem perceber que tem 2 registros ali na amostra errados, aquele campo ali será a 26 coluna entenderam?? e esta no lugar das primeiras, ocupando.
Ou seja, como eu trabalho com ferramenta q manipula o banco, ela absorve os dados q eu indico e eu trabalho com eles dentro da ferramenta, mas como q eu vou absorver os dados sendo q tem coluna bagunçada, string no lugar de date e etc.. o programa da erro entendem? ele absorve apenas 6,078 registros, 2 mil ele discarta pq estao zuados, e ele trabalha na base de tabelas e colunas, e esse programa q eu uso pega somente arquivos extensao .csv(1tabela,blocodenotas) ou um banco de dados ele absorve, no meu caso nao é banco… e sim a tabela A e B apenas, portanto nao tenho como fazer o q meu chefe precisa por ele.. meu boss estava tentando arrumar e resolver esse problema pelo excel, ele abriu o arquivo csv de 8mil registros pelo excel e estava tentando aplicar alguma formula sei lah para conseguir tudo de diferente entre as duas tabelas e pediu para eu tentar pelo Service Flow (ferramenta q eu trabalho) mas nao tem como.. me sobrou apenas 1 coisa, tentar arrumar isso fazendo um programinha PL/SQL, meu chefe depois de 5 horas ele chegou em min e disse, consegui cara arrumar pelo excel, achei uma formula, mas eu gostaria que voce criasse alguma rotina em PL ou sei lah para esse problemas, pois podem vir mais tabelas assim e eu já uso a sua rotina para corrigir isso.. ai eu falei FODEU!! AEHhaeuhaEUO
Nem sei a logica q eu tenho q usar, sao duas tabelas, A e B.. ambas com 8mil registros e ele quer tudo de diferente entre elas sendo q existem dados bagunçados, o que tenho que fazer??
Pensei primeiro numa procedure, faço um join juntando as duas e depois comparo linha por linha?? se a linha estiver igual eu pulo para a proxi, quando achar coisa diferente eu mando ele salvar a linha (um insert sei lah) dessa linha errada em outra tabela.. pensei isso mas tenho 1 mes quase de serviço, nao tenho ideia como fazer, a logica que usar, uso function? faço join? isso que gostaria de saber.. desculpem o texto por favor! agradeço a ajuda!!
16 de junho de 2010 às 5:47 pm #94599diegolenhardt
Participantecomeca vendo o resultado de:
SELECT *
FROM TABELA_A
MINUS
SELECT *
FROM TABELA_B
16 de junho de 2010 às 6:00 pm #94601Maths
ParticipanteAmigo, executei essa rotina no PL/SQL Developer e dei um execute, ele me trouxe 14rows, ai cliquei naquele botão fetch last page.. ele me trouxe 6,925 rows selected in 7,812 seconds.. o que seriam esses 6,925? o que fez essa query?
16 de junho de 2010 às 6:02 pm #94602diegolenhardt
Participantea diferenca da tabela A com tabela B.
16 de junho de 2010 às 6:04 pm #94603Maths
ParticipanteNão creio… só isso? Oo
Mas seria aqueles 16rows apenas que ele me trouxe ou quando eu clico no fecth last page os 6,925? oO, nao pode ser que tenham 7mil linhas de diferença.. eu nao vi tudo isso nem fodendo oO
Testei apenas a primeira parte da sua query.
Select *
from TABELA_AAdivinha??? Ele me trouxe tambem 6,925 oO.. tem algo errado nao tem??
16 de junho de 2010 às 7:31 pm #94609Maths
Participantee Queria reformular, na verdade, eu tenho a coluna A e a B certo? eu quero saber o que tem na coluna A que nao tem na B e o que tem na B que nao tem na A, entenderam?? sendo que sao 95% semelhantes esses 8 mil registros em cada uma, muda apenas algumas coisas, existem coisas na A que nao tem na B, e coisas na B que nao tem A.. porem eu nao tenho como identificar chave primaria.. pois alguns dados estao errados como eu disse no 1 post la emcima, na coluna “IDENTIFICADOR_PSYS” que é a minha primary key eu tenho dados em branco em alguns registros entendem? Vejam..
Identificador Psys
RCCF0111-1-152390466
RCCF0111-1-152390445
RCCF0111-1-152390473
RCCF0111-1-152390459
RCCF0111-1-152390438
RCCF0111-1-152390452
RCCF0111-1-152390431
RCCF0111-1-152390569
RCCF0111-1-152390674
RCCF0111-1-152390619
RCCF0111-1-152390647
RCCF0111-1-152390612
RCCF0111-1-152390605
RCCF0111-1-152390633
RCCF0111-1-152390653
RCCF0111-1-152390640
RCCF0111-1-152390626
RCCF0111-1-152390660
RCCF0111-1-152390667
RCCF0111-1-152390948
RCCF0111-1-152390933
RCCF0511-1-152586002
RCCF0511-1-152585995RCCF0511-1-152617476
RCCF0511-1-152578045
RCCF0511-1-152617647
RCCF0511-1-152617669RCCF0511-1-152617973
RCCF0511-1-152622515
RCCF0511-1-152622495
RCCF0611-1-152647723
RCCF0611-1-1526477860
26/5/2010 10:27RCCF0611-1-152656739
RCCF0911-1-152760246
RCCF0911-1-152760253
RCCF0911-1-152760304
16
RCCF0911-1-152760387
RCCF0911-1-152760825
RCCF0911-1-152791205
RCCF1011-1-152860075
RCCF1011-1-152844720
INFRAESTRUTURA ELÉTRICA / NOBREAK
INFRAESTRUTURA ELÉTRICA / NOBREAK
0
INFRAESTRUTURA ELÉTRICA / NOBREAK
INFRAESTRUTURA ELÉTRICA / NOBREAK
INFRAESTRUTURA ELÉTRICA / NOBREAK
INFRAESTRUTURA ELÉTRICA / NOBREAK
RCCF1011-1-152848015
RCCF1011-1-152852044Isso foi uma amostra de uns 60 registros da coluna IDENTIFICADOR_PSYS, a chave primaria da tabela A e B, deveria conter somente aquela formatação ali em todos os campos como voceis podem ver.. mas tem registros q estao em branco, outros com uma descrição, uma bagunça entendem?? entao eu queria saber o que tem de diferente entre essas duas tabelas, parece facil, mas esta dando erro em tudo aqui galera, nao to conseguindo, meu boss ta meio bravo sabe? de mau humor, nem posso perguntar nada a ele q ele solta fogo pelas orelhas.. x__x
Obs: nao adianta eu tentar arrumar a coluna ná mão linha por linha pois sao 8 mil registros em cada e tem dados em branco q eu nao sei, o pedido do meu chefe foi apenas TUDO Q TEM DE DIFERENTE ENTRE ELAS, NAO IMPORTA OS DADOS ERRADOS, ELE QUER TUDO DE DIF ENTRE A TABELA “A” E A “B”..(TODOS OS CAMPOS) mas agora nao sei como fazer x__x
16 de junho de 2010 às 8:35 pm #94610fsitja
ParticipanteEm primeiro lugar, esse campo com certeza não é primary key, pois primary key não poderia ter repetido nem ter null nele… não pode ser, o Oracle não deixa inserir e daria exception.
Você quer comparar só pelo campo IDENTIFICADOR_PSYS e ver a diferença sem olhar para os outros campos?
Daria para ver assim:
(SELECT IDENTIFICADOR_PSYS
FROM TABELA_A
UNION
SELECT IDENTIFICADOR_PSYS
FROM TABELA_B)
MINUS
(SELECT IDENTIFICADOR_PSYS
FROM TABELA_A
INTERSECT
SELECT IDENTIFICADOR_PSYS
FROM TABELA_B)
16 de junho de 2010 às 9:13 pm #94615Maths
Participantenada x__x
cara sabe o pq?? ele me deu de resultado a linha IDENTIFICADOR_PSYS COM 0 ROWS, nada.. nem erro ele deu, o pl/sql editor, justamente pq tem campos em branco na identificador_psys, na verdade meu chefe nao quer saber se tem ou nao chave primaria.. pensa nessas 2 tabelas como tabelas normais, sem chave primarias, ele quer saber tudo que TEM NA TABELA A E QUE NAO TENHA NA B, E TUDO QUE TENHA NA TABELA B QUE NAO TENHA NA A, A DIFERENÇA, entendeu?ou seja, eu precisaria comparar entre as duas tabelas.. exemplo..
a linha 1 é igual a todos as colunas da linha 1 da tabela B?? SIM, entao pula essa.. pq é igual, quero tudo de dif entre as duas no meio desses 8 mil registros de cada uma, entendeu?? embaçado, x_x, porem o identificador psys que ele me disse para usar como identificador nao tem os dados 100% certos, como eu disse, tem arquivos em branco, tem string misturada em alguns registros… tendeu?? nao existe forma de comparar isso sem ser pensando em uma tabela? mas como se fosse string tudo, entendeu? exemplo, a palavra banana é igual a banana2? Nao, ja guarda isso em um lugar.. e isso para 8mil linhas x__x e comparando entre as duas, saco? eu to quase desistindo, n tenho ideia de cmo fazer.. e meu chefe todo cuzao, mostrei para ele 1 comando ele disse, cara, nao me mostra isso, me mostra o resultado final, dando certo >>.. todo ignorante sabe? e o foda q era um problema dele, eu sou estagiario apenas… ele me pediu ajudar no problema dele e agora ta cobrando?? porra, tenho 2 mss de experiencia e ele uns 10.. ate q o fdp resolveu isso pelo excel e quer q eu resolva por pl ou sql, faça uma rotina.. sei lah, para quando der no futuro, ele usar a minha e pronto >>
16 de junho de 2010 às 9:37 pm #94616fsitja
ParticipanteOlha… tá complicado de entender o que tem nessas tabelas. Mas posso lhe dizer que o que o Diego postou no começo é o caminho… A ideia é fazer a subtração de uma tabela pela outra, ou seja, a diferença:
(select col1, col2, col3 from tab1
minus
select col1, col2, col3 from tab2)
union all
(select col1, col2, col3 from tab2
minus
select col1, col2, col3 from tab1)
Isso acima vai te dar o que existe na A que não existe idêntico na B e vice-versa.
Porém… quanto à qualidade de dados, eu realmente não estou entendendo o que está acontecendo… só se você postar exemplo de dados das duas tabelas, exemplo do que você quer obter, daí daria para nós testarmos, senão a gente vai ficar tateando no escuro, pois não tem como fazer o diagnóstico sem ver com nossos olhos.
16 de junho de 2010 às 9:43 pm #94618Maths
ParticipanteSao duas tabelas, .csv, voce pode abrir pelo bloco de notas ou pelo excel, vou upar elas aqui ok? Por favor, agradeço mtu se voceis dessem uma olhada…
Tabela A:
http://rapidshare.com/files/399736362/r … 1.csv.htmlTabela B:
http://rapidshare.com/files/399736700/r … 2.csv.htmlNAO SE ASSUSTEM AEUHAEUHAEOAE
16 de junho de 2010 às 9:45 pm #94619fsitja
Participante[quote=”Maths”:2ts8lvwv]Sao duas tabelas, .csv, voce pode abrir pelo bloco de notas ou pelo excel, vou upar elas aqui ok? Por favor, agradeço mtu se voceis dessem uma olhada…
Tabela A:
http://rapidshare.com/files/399736362/r … 1.csv.htmlTabela B:
http://rapidshare.com/files/399736700/r … 2.csv.htmlNAO SE ASSUSTEM AEUHAEUHAEOAE[/quote]
É bloqueado aqui no meu trabalho, o firewall barra o rapidshare.
Vou ver depois lá em casa.
16 de junho de 2010 às 9:58 pm #94620Maths
ParticipanteObrigadoooo, agradeço muito..
Se voce ver as tabelas fica muito mais facil para voce entender e tentar me ajudar a resolver esse problema, ficaria mtu grato! Obrigado
17 de junho de 2010 às 8:36 am #94644fsitja
ParticipanteEntão, carreguei os arquivos aqui e, rodando o SQL abaixo me retornou 9 linhas, conforme segue:
SQL> (select start_time, end_time, dta_ult_alt, identificador_psys, solucao_id, status from tab_a1
2 union
3 all
4 select start_time, end_time, dta_ult_alt, identificador_psys, solucao_id, status from tab_a2)
5 minus
6 (select start_time, end_time, dta_ult_alt, identificador_psys, solucao_id, status from tab_a1
7 intersect
8 select start_time, end_time, dta_ult_alt, identificador_psys, solucao_id, status from tab_a2);START_TIME END_TIME DTA_ULT_ALT IDENTIFICADOR_PSYS SOLUCAO_ID STATUS
11/06/2010 20:56 15/06/2010 11:37 RCCF1106-1-169781306 20064004 Em Resolucao
14/06/2010 21:24 15/06/2010 09:01 15/06/2010 09:12 RCCF1406-1-170052727 20063634 Fechado
14/06/2010 21:24 15/06/2010 09:01 15/06/2010 09:12 RCCF1406-1-170052734 20071485 Fechado
15/06/2010 08:06 15/06/2010 08:12 15/06/2010 10:17 RCCF1506-1-170061128 20086075 Fechado
15/06/2010 08:06 15/06/2010 08:12 15/06/2010 10:17 RCCF1506-1-170061170 20086074 Fechado
15/06/2010 08:07 15/06/2010 08:13 15/06/2010 10:17 RCCF1506-1-170061182 20086076 Fechado
15/06/2010 11:01 15/06/2010 11:32 RCCF1506-1-170061494 20063619 Em Resolucao
15/06/2010 11:46 15/06/2010 11:57 RCCF1506-1-170133325 20063689 Em Resolucao
15/06/2010 11:46 15/06/2010 12:07 RCCF1506-1-170133325 20063689 Em Resolucao9 rows selected
Aquele SQL que eu tinha postado acima usando select * funcionou também aqui, de repente suas 2 tabelas estão com as colunas em ordens diferentes, daí o * pegaria para comparar colunas diferentes.
Ou então durante a carga para as tabelas deu alguma zica e corrompeu algo…
17 de junho de 2010 às 4:40 pm #94648Maths
ParticipanteOlaaa, bom dia!!
Então, primeiramente agradeço muitoo pelas querys, mas entao, aquela ali com o * ele executa e me traz 7 rows, porem se eu clico naquele FETCH LAST PAGE (uma setinha verde) ele me traz 13,846 registros oO.. errado certo? pq isso é +/- o total de TODOS OS REGISTROS das duas tabelas juntas, nunca que teria praticamente tudo de diferente assim (Outra coisa, o que seria exatamente o fetch last page?)
Sobre a query com as 6 colunas de exemplo que voce postou aqui me trouxe 4 rows apenas.. e ai 6, eu vou adicionar TODAS as colunas da tabela na query e testar, mas será que é isso mesmo?? A diferença entre as duas??
17 de junho de 2010 às 8:10 pm #94650fsitja
ParticipanteO resultado do “FETCH LAST PAGE” é o que interessa, se aparece 7 ou 10 antes de dar todo o fetch não importa pois ainda tem mais linhas para exibir. É só a interface do programa que você está usando.
Sobre o resultado, é aquilo que eu falei acima:
– ou suas duas tabelas estão com a estrutura ou a ordem das colunas diferentes, por isso dá tudo (13 mil) com diferença.
– ou tenta recarregar as tabelas novamente, porque pode ter sido feito algum erro na carga delas, porque na carga que eu testei deu 9 linhas de diferença, conforme postei acima. -
AutorPosts
- Você deve fazer login para responder a este tópico.