INSERT INTO COM VARIOS SELECT

WEBIER 29/12/2016 17:11:50
#470185
Criei um topico recente (que fechei), onde formos parar nesse dilema...

Todo mundo sabe que um INSERT INTO pode ser preenchido com uma SELECT,

Exemplo:
INSERT INTO TBdestina ( campo01, campo02) SELECT campoX, CampoY FROM TBOrigem_A


A minha duvida é usar 02 ou mais Select para selecionar dados de 02 ou mais tabelas... se é possivel

INSERT INTO [txt-color=#e80000]TBdestina ( campo01, campo02)[/txt-color] SELECT (SELECT campoX FROM TBOrigem_[txt-color=#e80000]A[/txt-color]) as varCampoA, (SELECT campoY FROM TBOrigem_[txt-color=#e80000]B[/txt-color]) as varCampoB

vejam que a tabela TBDestina tá sendo preenchida com 2 tabelas distintas...
é possivel fazer isso? é dessa forma que eu dê o exemplo?
SINCLAIR 29/12/2016 18:04:00
#470187
WEBIER,


Não conheço a sintaxe do banco de dados que você usa.

De qualquer forma, o campo de origem pode ser um select que reúna apenas um campo de uma tabela ou cruzamento delas.

Exemplo


INSERT INTO

Tab_Destino

(campo_01 , campo 02)

Values

( select campo_A from Alguma_Tabela where ( x = y ) ) ,
( select campo_B from Outra_Tabela where ( x = y ) and ( a = b ) )



LVFIOROT 29/12/2016 19:16:05
#470188
Resposta escolhida
no mssql > union all

select c1, c2 from tb1
union all
select c1, c2 from tb2
WEBIER 29/12/2016 20:20:34
#470189
fiz assim:

sSQL = [Ô]INSERT INTO NotaFiscalItens ( [Ô] & _
[Ô]CodigoProduto, [Ô] & _
[Ô]NomeProduto) [Ô] & _
[Ô]VALUES [Ô] & _
[Ô](SELECT pedidos_itens.cod_produto FROM produtos INNER JOIN pedidos_itens ON produtos.codigo = pedidos_itens.cod_produto INNER JOIN pedidos ON pedidos_itens.cod_pedido = pedidos.cod_pedido WHERE pedidos_itens.COD_PEDIDO = [Ô] & txtCodPedido.Text & [Ô]) as varCodProduto, [Ô] & _
[Ô](SELECT pedidos_itens.descricao FROM produtos INNER JOIN pedidos_itens ON produtos.codigo = pedidos_itens.cod_produto INNER JOIN pedidos ON pedidos_itens.cod_pedido = pedidos.cod_pedido WHERE pedidos_itens.COD_PEDIDO = [Ô] & txtCodPedido.Text & [Ô]) as varNomeProduto ;[Ô]

Uso SQL 2008 Express

Deu o erro da imagem acima
KERPLUNK 29/12/2016 21:57:20
#470190
O que você está tentando se chama subquery. Cada uma delas retorna um valor. A cláusula Values do comando Insert, deve ser especificada entre parênteses, portanto:

Insert Into Tabela (campo1, campo2, campo3)
values(
(select campo1 from outraTabela inner join terceiraTabela on outraTabela.campoA = terceiraTabela.campoB Where x = y),
(select campo1 from outraTabela inner join terceiraTabela on outraTabela.campoA = terceiraTabela.campoB Where x = y),
(select campo1 from outraTabela inner join terceiraTabela on outraTabela.campoA = terceiraTabela.campoB Where x = y),
)
SINCLAIR 30/12/2016 07:44:29
#470192
WEBIER,

Nosso colega KERPLUNK tem razão, a cláusula values precisa estar entre parêntesis (ou parênteses, ambas palavras estão corretas). No meu exemplo não coloquei porque imaginei que você faria isto, durante a adaptação.

No exemplo que citei acima, portanto, ficaria assim:


INSERT INTO

Tab_Destino

(campo_01 , campo 02)

Values

(

( select campo_A from Alguma_Tabela where ( x = y ) ) ,
( select campo_B from Outra_Tabela where ( x = y ) and ( a = b ) )

)



Apenas colocando os parêntesis faltantes, sem avaliar a sintaxe de seu código:


sSQL = [Ô]INSERT INTO NotaFiscalItens ( [Ô] & _
[Ô]CodigoProduto, [Ô] & _
[Ô]NomeProduto) [Ô] & _
[Ô]VALUES [txt-color=#e80000]([/txt-color][Ô] & _
[Ô](SELECT pedidos_itens.cod_produto FROM produtos INNER JOIN pedidos_itens ON produtos.codigo = pedidos_itens.cod_produto INNER JOIN pedidos ON pedidos_itens.cod_pedido = pedidos.cod_pedido WHERE pedidos_itens.COD_PEDIDO = [Ô] & txtCodPedido.Text & [Ô]) as varCodProduto, [Ô] & _
[Ô](SELECT pedidos_itens.descricao FROM produtos INNER JOIN pedidos_itens ON produtos.codigo = pedidos_itens.cod_produto INNER JOIN pedidos ON pedidos_itens.cod_pedido = pedidos.cod_pedido WHERE pedidos_itens.COD_PEDIDO = [Ô] & txtCodPedido.Text & [Ô]) as varNomeProduto[txt-color=#e80000])[/txt-color] ;[Ô]
PLUGSOFTSM 30/12/2016 11:43:12
#470196
sSQL = [Ô]INSERT INTO NotaFiscalItens ( CodigoProduto, NomeProduto) VALUES
SELECT pedidos_itens.cod_produto, pedidos_itens.descricao FROM (pedidos_itens INNER JOIN pedidos ON pedidos_itens.cod_pedido = pedidos.cod_pedido)
WHERE pedidos_itens.COD_PEDIDO = [Ô] & txtCodPedido.Text

Notas: Por que vc usa a tabela produtos na consulta, uma vez que nenhum dado extraido dela é usado para o seu insert;
Imaginando-se que teu insert use outros valoes que venham da tabela produtos e você não citou, e vc precise referenciar a tabela produtos, a tua consulta ficaria assim


sSQL = [Ô]INSERT INTO NotaFiscalItens ( CodigoProduto, NomeProduto, Valor1_Produto, Valor2_Produto) VALUES
SELECT pedidos_itens.cod_produto, pedidos_itens.descricao, Produtos.Valor1_Produto, Produtos.Valor2_Produtos
FROM ((pedidos_itens INNER JOIN pedidos ON pedidos_itens.cod_pedido = pedidos.cod_pedido) Left Join Produtos On
produtos.codigo = pedidos_itens.cod_produto) WHERE pedidos_itens.COD_PEDIDO = [Ô] & txtCodPedido.Text
WEBIER 30/12/2016 12:21:45
#470197
fiz conforme o SINCLAIR postou, se houver somente 1 registro... FUNCIONA NORMAL... se for varios registros, retorna o erro acima

sSQL = [Ô]INSERT INTO NotaFiscalItens ( [Ô] & _
[Ô]CodigoProduto, [Ô] & _
[Ô]NomeProduto) [Ô] & _
[Ô]VALUES ([Ô] & _
[Ô](SELECT produtos.codigo FROM produtos INNER JOIN pedidos_itens ON produtos.codigo = pedidos_itens.cod_produto INNER JOIN pedidos ON pedidos_itens.cod_pedido = pedidos.cod_pedido WHERE pedidos_itens.COD_PEDIDO = [Ô] & txtCodPedido.Text & [Ô]), [Ô] & _
[Ô](SELECT produtos.descricao FROM produtos INNER JOIN pedidos_itens ON produtos.codigo = pedidos_itens.cod_produto INNER JOIN pedidos ON pedidos_itens.cod_pedido = pedidos.cod_pedido WHERE pedidos_itens.COD_PEDIDO = [Ô] & txtCodPedido.Text & [Ô]) );[Ô]



Me perguntaram pq tou fazendo um INSERT INTO com varios SELECT... é pq no campo VALUES vou usar dados de 2 tabelas e de objeto do form

no final vai ficar assim:
sSQL = [Ô]INSERT INTO TB_Destino ( [Ô] & _
[Ô][txt-color=#e80000]Campo1[/txt-color], [Ô] & _
[Ô][txt-color=#0000f0]Campo2[/txt-color], [Ô] & _
[Ô][txt-color=#007100]Campo3[/txt-color], [Ô] & _
[Ô][txt-color=#8A2BE2]Campo4[/txt-color]) [Ô] & _
[Ô]VALUES ([Ô] & _
[Ô][txt-color=#e80000](SELECT CampoX FROM TB_01 WHERE A = B)[/txt-color], [Ô] & _
[Ô][txt-color=#0000f0](SELECT CampoX FROM TB_01 WHERE A = B)[/txt-color], [Ô] & _
[Ô][txt-color=#007100](SELECT CampoY FROM TB_02 WHERE A = B)[/txt-color], [Ô] & _
[Ô] [txt-color=#8A2BE2][Ô] & Val(TEXT1.Text) & [Ô][/txt-color] [Ô] & _
[Ô] );[Ô]

LVFIOROT 30/12/2016 12:43:00
#470198
como eu disse...

  

INSERT INTO [dbo].[tb1]
([c1]
,[c2])
SELECT TOP (1000) [c1]
,[c2]
FROM [teste].[dbo].[tb2]
union all
SELECT TOP (1000) [c1]
,[c2]
FROM [teste].[dbo].[tb3]
WEBIER 30/12/2016 12:49:15
#470199
Citação:

:
como eu disse...

  

INSERT INTO [dbo].[tb1]
([c1]
,[c2])
SELECT TOP (1000) [c1]
,[c2]
FROM [teste].[dbo].[tb2]
union all
SELECT TOP (1000) [c1]
,[c2]
FROM [teste].[dbo].[tb3]



Bom dia, LVFIOROT

Será se o union all aplica-se ao que eu quero?

Quero pegar registros da tabela Produtos relacionar com a tabela PEDIDO_ITENS, quero pegar registros de mais outra tabela... e pegar dados exibidos no form (text1)... e com esses dados preencher 1 ou mais registros na tabela NotaFiscalItens

resumidamente isso:
sSQL = [Ô]INSERT INTO TB_Destino ( [Ô] & _
[Ô][txt-color=#e80000]Campo1[/txt-color], [Ô] & _
[Ô][txt-color=#0000f0]Campo2[/txt-color], [Ô] & _
[Ô][txt-color=#007100]Campo3[/txt-color], [Ô] & _
[Ô][txt-color=#8A2BE2]Campo4[/txt-color]) [Ô] & _
[Ô]VALUES ([Ô] & _
[Ô][txt-color=#e80000](SELECT CampoX FROM TB_01 WHERE A = B)[/txt-color], [Ô] & _
[Ô][txt-color=#0000f0](SELECT CampoX FROM TB_01 WHERE A = B)[/txt-color], [Ô] & _
[Ô][txt-color=#007100](SELECT CampoY FROM TB_02 WHERE A = B)[/txt-color], [Ô] & _
[Ô] [txt-color=#8A2BE2][Ô] & Val(TEXT1.Text) & [Ô][/txt-color] [Ô] & _
[Ô] );[Ô]

LVFIOROT 30/12/2016 14:01:36
#470201
teste e veja vc mesmo......

Página 1 de 2 [20 registro(s)]
Tópico encerrado , respostas não são mais permitidas