subquery com substring

09/04/2015

Bom dia pessoal,
Tenho um select que me retorna alguns dados de um arquivo txt, preciso inserir mensalmente esses dados numa tabela. Não são dados que são alterados com frequença, porem pode ser que algum momento, seja feita inclusão de dados novos.


Estou tentando fazer as seguinte subquery e me retorna 0, sendo que deveria inserir 1 linha na tabela .

insert into tb2 (nome, produto,unidade)
select
 
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' ,

from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
   and not exists (select NOME from tb2  where ID_CARGO  not in (1,2,3,4,5,6,7,9))



Voces saberiam me dizer o que está errado.

Melhor resposta

09/04/2015

Simone, verifique se essa instrução executa corretamente:
select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
  CONVERT (INT,SUBSTRING (dados, 46,9)) AS 'codigo'
from tb1  
where SUBSTRING(dados, 1,2) = 'TC'
and CONVERT (INT, SUBSTRING (tb1.dados, 46,9)  not in (select COD_CARGO from tb2)

Em seguida, corrija a instrução no subselect para que atenda a regra em questão e retorne apenas os códigos que cargos que vc precisa q retorne.

Marisiana

Responder Citar

Outras Respostas

09/04/2015

Marcos P

select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'


Retorna registros ?

Se retornar, fica faltando a ligação entre as tabelas "t1" e "t2" na subquery

select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
   and not exists (select NOME from tb2  where ID_CARGO  not in (1,2,3,4,5,6,7,9) and tb1.chave = tb2.chave)



ou a referência da subquery a alguma coluna na tabela principal

select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
   and cargo = (select NOME from tb2  where ID_CARGO  not in (1,2,3,4,5,6,7,9))
Responder Citar

09/04/2015

Dbajr

Oi Marcos,
O primeiro select retorna valor sim, havia esquecido de uma linha do select.
Tentei fazer o seu ultimo codigo, aparece que 1 linha foi inserida, mas no caso 2 linhas deveria ser inseridas.

Ficou assim


insert into tb2
select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
  CONVERT (INT,SUBSTRING (dados, 46,9)) AS 'codigo'
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
    and CONVERT (INT,SUBSTRING (dados, 46,9)) = (select COD_CARGO from  tb2  where COD_CARGO  not in (5491,5491,5492,5492,5493,5494,5495,5496,5498,5520,5521))


Responder Citar

09/04/2015

Marcos P

Concentre-se primeiro no select, para depois resolver o insert...

select COD_CARGO from  tb2  where COD_CARGO  not in (5491,5491,5492,5492,5493,5494,5495,5496,5498,5520,5521)

Retorna quantas linhas ?
Responder Citar

09/04/2015

Dbajr

Não retorna nada no select.
Responder Citar

09/04/2015

Marcos P

Então, todo seu select não vai funcionar....

Comece revisando esse select da subquery !
Responder Citar

09/04/2015

Dbajr

Então, acho meu raciocínio estava errado.
Eu preciso inserir na tb2 apenas os registros que contem na tb1 e nao contem na tb2.
Seria isso ..?



Insert into tb2
select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
  CONVERT (INT,SUBSTRING (dados, 46,9)) AS 'codigo'
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
  and not exists (select COD_CARGO from tb2)



Responder Citar

09/04/2015

Marcos P

Qual o campo chave entre as duas tabelas ?

Sabendo isso, ajuste para :

:
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
  and not exists (select COD_CARGO from tb2 and tb1.chave = tb2.chave)
Responder Citar

09/04/2015

Dbajr

a tb1 não tem chave, como a utilizo pra importar dados de um arquivo txt, ela tem apenas 2 colunas "linhas" e "id."
Uso o seguinte comando, pra pegar apenas os dados necessários.
Onde eu consigo verificar o codigo do cargo é na ultima linha, porem acho que não é possivel utiliza - lo no campo chave
, estou correta?

  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
  CONVERT (INT,SUBSTRING (dados, 46,9)) AS 'codigo'
Responder Citar

09/04/2015

Marcos P

Mas existe alguma lógica na relação entre elas, certo ?

Se for por "codigo", assumindo que tb1 é a tabela com os dados do TXT, faça...

:
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
  and not exists (select COD_CARGO from tb2 and CONVERT (INT,SUBSTRING (tb1.dados, 46,9)) = tb2.codigo)


Senão, use o mesmo raciocínio para os campos que suportam a ligação entre essas tabelas !
Responder Citar

09/04/2015

Dbajr

Sim o código é a relação.
Fiz como indicou e esta aparecendo a mensagem que o and proximo ao CONVERT esta incorreto, e o tb2 do insert into também.
Responder Citar

09/04/2015

Marisiana

Qual é o campo que vc deve utilizar para comparar com os códigos de cargos retornados no subselect?
and ---<aqui deve ter o o campo q contém a informação que será comparado com os valores retornados no subselect>---
                    not exists (select COD_CARGO from tb2)
Responder Citar

09/04/2015

Dbajr

Então, o campo na tb1 seria o CONVERT (INT, SUBSTRING (tb1.dados, 46,9) mesmo, porem esta dando erro no "and",


where SUBSTRING(dados, 1,2) = 'TC'
  and not exists (select COD_CARGO from tb_CARGO and CONVERT (INT, SUBSTRING (tb1.dados, 46,9)) = tb2.COD_CARGO)
Responder Citar

09/04/2015

Marcos P

Esqueça o insert... ele não vai funcionar enquanto o select não funcionar !

Conhece do Fiddler ?

É um serviço web que você pode criar bases de dados para fins de depuração e testes de scripts sql.

Veja esse exemplo que preparei em outro post, o que pode ser feito com ele... [url:descricao=http://sqlfiddle.com/#!6/8a050/2]http://sqlfiddle.com/#!6/8a050/2[/url]

Se você puder, crie alguns registros lá, que podemos trabalhar na query juntos.
Responder Citar

09/04/2015

Marisiana

Veja se esse select funciona...
select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
  CONVERT (INT,SUBSTRING (dados, 46,9)) AS 'codigo'
from tb1  
where SUBSTRING(dados, 1,2) = 'TC'
and CONVERT (INT, SUBSTRING (tb1.dados, 46,9)  not exists (select COD_CARGO from tb2)
Responder Citar

09/04/2015

Marisiana

Não sei se funciona no SQLServer, mas tenta utilizar NOT IN no lugar de NOT EXISTS
Responder Citar