Usuário com melhor resposta
Insert com Select com duas ou mais tabelas e um valor fixo para uma coluna

Pergunta
-
Olá, pessoal.
Preciso de uma ajuda.
Tenho uma tabela chamada EXCEÇÃO onde tenho varias colunas.
exemplo:
me_cd, pd_cd, trib_cd, me_aliqicmsdentrouf, me_redicmsdentrouf, me_aliqicmsforauf, me_redicmsforauf
preciso inserir nessa tabela dados referente a mais duas tabelas (PROD e NAT)
Só que da PROD só preciso de uma coluna (mas são várias linhas).
E da NAT pego todas as outras COLUNAS, só NÃO a "TRIB_CD" que tem que ser um valor FIXO.
como consigo fazer um INSERT na EXECEÇÃO com um select da PROD e NAT e informando que o campo TRIB_CD receberá o valor "x"??
Respostas
-
Deleted
- Marcado como Resposta Everton.moreira sexta-feira, 28 de março de 2014 11:30
Todas as Respostas
-
-
-
-
-
-
Amigo, acho que me expressei errado.
é assim:
A tabela Produtos NÃO tem relação com a tabela NATUREZA. Sò a tabela EXCEÇÃO terá relação quando inserido os produtos que devem ficar como "exceção".
Funciona assim.
Tenho a tabela produtos onde os mesmos estão cadastrados, nessa tabela só o que me interessa é a Coluna PD_CD.
A tabela NAT é as configurações das vendas para os produtos, as vendas são SEM TRIBUTAÇÃO onde o codigo do TRIB_CD é "60", ai é quando entra a EXCEÇÃO.
Nesta tabela (EXCEÇÃO) insiro o PD_CD da PROD e o ME_CD da NAT, só que o TRIB_CD tem que ficar com o VALOR "00".
Ou seja, a tabela EXCEÇÃO é composta da tabela PROD só com a Coluna PD_CD, mais as demais COLUNAS a tabela NAT só diferenciando a TRIB_CD que deve ser igual a "00".
NAT.me_cd PROD.pd_cd trib_cd NAT.me_aliqicmsdentrouf NAT.me_aliqicmsforauf CO02 11500 00 18 12 -
-
Boa noite, José.
Me desculpe a demora pela resposta.
Então, da tabela :
PROD o PD_CD é a PK
E sua tabela é formada por estas duas abaixo e mais um monte
pd_cd pd_icmsst
11500 SNAT o ME_CD é a PK e na
EXCEÇÃO o PD_CD + ME_CD são as PK's
As coluna que compõe a NAT são estas 4 abaixo e mais 138 colunas
me_cd trib_cd cfo_forndentrouf me_ds CO02 60 5.102 COMPRA - DE CO03 60 5.102 COMPRA P/ ESTOQUE (OUTROS)
E as colunas que compoem a EXCEÇÃO são estas abaixo e mais umas 100
me_cd pd_cd trib_cd me_aliqicmsdentrouf CO02 11500 00 18 CO03 11500 00 18 CO04 11500 00 18 A regra que define para que um PD_CD vá para a EXCEÇÃO é que uma coluna na PROD chamada PD_ICMSST, onde o valor é "S" ou "N". Estando como "N" ai este produto é classificado como EXCEÇÃO.
Então na EXCEÇÃO o pd_cd é INSERIDO para cada ME_CD que seu TRIB_CD é 60.
-
-
Bom dia, José.
Respondendo a sua duvida, o valor do campo na Coluna pd_icmsst deve estar sim como "N", ou seja, o produto não é ICMS-ST. Sendo assim ele é uma EXCEÇÃO.
Eu executei seu codigo acima e deu um erro, a mensagem foi a seguinte:
Não é possível inserir uma linha de chave duplicada no objeto 'dbo.tab_mep' com índice exclusivo 'pktab_mep'. O valor da chave duplicada é (1125/5T , CO02).
Só que este produto nao esta na EXCEÇÃO.
e o OUTPUT também deu um erro:
Msg 102, Level 15, State 1, Line 22
Sintaxe incorreta próxima a 'output'.CODIGO 3
with
PROD_NAT as
(
SELECT P.pd_cd, N.me_cd, N.trib_cd, N.me_aliqicmsdentrouf, N.me_redicmsdentrouf, N.me_aliqicmsforauf, N.me_redicmsforauf, N.me_baseretidodentrouf, N.me_baseretidoforauf, N.me_destacareddentrouf, N.me_destacaredforauf, N.cfo_forndentrouf, N.cfo_fornforauf, N.cfo_escrdentrouf, N.cfo_escrforauf, N.cfo_ncontforndentrouf, N.cfo_ncontfornforauf, N.cfo_ncontescrdentrouf, N.cfo_ncontescrforauf, N.me_obscomp, N.me_redicmsdifdentrouf, N.me_redicmsdifforauf, N.trib_cdpis, N.trib_cdcofins, N.incide_pis, N.incide_cofins, N.cod_cred, N.nat_bc_cred, N.trib_cdipi
from (SELECT pd_cd from ger_pd p where NOT EXISTS (SELECT pd_cd FROM tab_mep WHERE TAB_MEP.pd_cd=P.pd_cd) AND pd_icmsst='N') as P
cross join
(SELECT * from tab_mep where me_cd in ('CO02','VE01','DC01','DV01','TE01','TS01') ) as N
)
MERGE
into tab_mep as E
using PROD_NAT as PN
on PN.me_cd = E.me_cd and PN.pd_cd = E.pd_cd
when not matched by target then
INSERT (me_cd, pd_cd, trib_cd, me_aliqicmsdentrouf, me_redicmsdentrouf, me_aliqicmsforauf, me_redicmsforauf, me_baseretidodentrouf, me_baseretidoforauf, me_destacareddentrouf, me_destacaredforauf, cfo_forndentrouf, cfo_fornforauf, cfo_escrdentrouf, cfo_escrforauf, cfo_ncontforndentrouf, cfo_ncontfornforauf, cfo_ncontescrdentrouf, cfo_ncontescrforauf, me_obscomp, me_redicmsdifdentrouf, me_redicmsdifforauf, trib_cdpis, trib_cdcofins, incide_pis, incide_cofins, cod_cred, nat_bc_cred, trib_cdipi)
values (me_cd, pd_cd, '00', me_aliqicmsdentrouf, me_redicmsdentrouf, me_aliqicmsforauf, me_redicmsforauf, me_baseretidodentrouf, me_baseretidoforauf, me_destacareddentrouf, me_destacaredforauf, cfo_forndentrouf, cfo_fornforauf, cfo_escrdentrouf, cfo_escrforauf, cfo_ncontforndentrouf, cfo_ncontfornforauf, cfo_ncontescrdentrouf, cfo_ncontescrforauf, me_obscomp, me_redicmsdifdentrouf, me_redicmsdifforauf, trib_cdpis, trib_cdcofins, incide_pis, incide_cofins, cod_cred, nat_bc_cred, trib_cdipi);
output $action, inserted.me_cd, inserted.pd_cd;
goObs. ger_pd é a tabela PROD
tab_me é a tabela NAT
tab_mep é a tabela EXCEÇÃO
-
Deleted
- Marcado como Resposta Everton.moreira sexta-feira, 28 de março de 2014 11:30
-
-
-
BOA TARDE.
RETIRANDO A FUNÇÃO RTRIM () DEU ERRO INFORMANDO QUE A TABELA NÃO ACEITA CHAVE DUPLICADA, OU SEJA, O PD_CD + ME_CD.
JÁ A CLAUSULA OUTPUT NÃO FUNCIONOU.
;with
PROD_NAT as (
SELECT P.pd_cd, N.*
from (SELECT rtrim(pd_cd) as pd_cd from ger_pd where pd_icmsst='N') as P
cross join
(SELECT * from tab_me where me_cd in ('CO02','VE01','DC01','DV01','TE01','TS01') ) as N
)
MERGE
into tab_mep as E
using PROD_NAT as PN
on E.pd_cd = PN.pd_cd and E.me_cd = PN.me_cd
when not matched by target then
INSERT (pd_cd, me_cd, trib_cd, me_aliqicmsdentrouf, me_redicmsdentrouf, me_aliqicmsforauf, me_redicmsforauf, me_baseretidodentrouf, me_baseretidoforauf, me_destacareddentrouf, me_destacaredforauf, cfo_forndentrouf, cfo_fornforauf, cfo_escrdentrouf, cfo_escrforauf, cfo_ncontforndentrouf, cfo_ncontfornforauf, cfo_ncontescrdentrouf, cfo_ncontescrforauf, me_obscomp, me_redicmsdifdentrouf, me_redicmsdifforauf, trib_cdpis, trib_cdcofins, cod_cred, nat_bc_cred, trib_cdipi)
values (PN.pd_cd, PN.me_cd, '00', me_aliqicmsdentrouf, me_redicmsdentrouf, me_aliqicmsforauf, me_redicmsforauf, me_baseretidodentrouf, me_baseretidoforauf, me_destacareddentrouf, me_destacaredforauf, cfo_forndentrouf, cfo_fornforauf, cfo_escrdentrouf, cfo_escrforauf, cfo_ncontforndentrouf, cfo_ncontfornforauf, cfo_ncontescrdentrouf, cfo_ncontescrforauf, me_obscomp, me_redicmsdifdentrouf, me_redicmsdifforauf, trib_cdpis, trib_cdcofins, cod_cred, nat_bc_cred, trib_cdipi);
--output $action, inserted.pd_cd, inserted.me_cd;
-
-