subquery com substring
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 .
Voces saberiam me dizer o que está errado.
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.
Simone
Curtidas 0
Melhor post
Marisiana Battistella
09/04/2015
Simone, verifique se essa instrução executa corretamente:
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.
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.
GOSTEI 1
Mais Respostas
Marcos P
09/04/2015
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))
GOSTEI 0
Simone
09/04/2015
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
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))
GOSTEI 0
Marcos P
09/04/2015
Concentre-se primeiro no select, para depois resolver o insert...
Retorna quantas linhas ?
select COD_CARGO from tb2 where COD_CARGO not in (5491,5491,5492,5492,5493,5494,5495,5496,5498,5520,5521)
Retorna quantas linhas ?
GOSTEI 0
Simone
09/04/2015
Não retorna nada no select.
GOSTEI 0
Marcos P
09/04/2015
Então, todo seu select não vai funcionar....
Comece revisando esse select da subquery !
Comece revisando esse select da subquery !
GOSTEI 0
Simone
09/04/2015
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 ..?
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)
GOSTEI 0
Marcos P
09/04/2015
Qual o campo chave entre as duas tabelas ?
Sabendo isso, ajuste para :
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)
GOSTEI 0
Simone
09/04/2015
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?
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'
GOSTEI 0
Marcos P
09/04/2015
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...
Senão, use o mesmo raciocínio para os campos que suportam a ligação entre essas tabelas !
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 !
GOSTEI 0
Simone
09/04/2015
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.
Fiz como indicou e esta aparecendo a mensagem que o and proximo ao CONVERT esta incorreto, e o tb2 do insert into também.
GOSTEI 0
Marisiana Battistella
09/04/2015
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)GOSTEI 0
Simone
09/04/2015
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)
GOSTEI 0
Marcos P
09/04/2015
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.
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.
GOSTEI 0
Marisiana Battistella
09/04/2015
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)
GOSTEI 0
Marisiana Battistella
09/04/2015
Não sei se funciona no SQLServer, mas tenta utilizar NOT IN no lugar de NOT EXISTS
GOSTEI 0
Marcos P
09/04/2015
Esse "and" que você colocou está errado...
Troque- por "WHERE"...
: 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)
Troque- por "WHERE"...
: where SUBSTRING(dados, 1,2) = 'TC' and not exists (select COD_CARGO from tb_CARGO WHERE CONVERT (INT, SUBSTRING (tb1.dados, 46,9)) = tb2.COD_CARGO)
GOSTEI 0
Simone
09/04/2015
Usei o exemplo da Marisiana e deu certo!
Obrigada pela atenção pessoal.
Obrigada pela atenção pessoal.
GOSTEI 0
Marcos P
09/04/2015
Ótimo !!!
GOSTEI 0
Marisiana Battistella
09/04/2015
Por nada Simone!!
GOSTEI 0