subquery com substring
09/04/2015
0
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
Post mais votado
09/04/2015
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 Battistella
Mais Posts
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))
09/04/2015
Simone
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))
09/04/2015
Marcos P
select COD_CARGO from tb2 where COD_CARGO not in (5491,5491,5492,5492,5493,5494,5495,5496,5498,5520,5521)
Retorna quantas linhas ?
09/04/2015
Marcos P
Comece revisando esse select da subquery !
09/04/2015
Simone
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)
09/04/2015
Marcos P
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)
09/04/2015
Simone
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'
09/04/2015
Marcos P
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 !
09/04/2015
Simone
Fiz como indicou e esta aparecendo a mensagem que o and proximo ao CONVERT esta incorreto, e o tb2 do insert into também.
09/04/2015
Marisiana Battistella
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)
09/04/2015
Simone
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)
09/04/2015
Marcos P
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.
09/04/2015
Marisiana Battistella
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)
09/04/2015
Marisiana Battistella
Clique aqui para fazer login e interagir na Comunidade :)