Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

antonio.alex

Problemas Insert

Recommended Posts

Bom dia, preciso fazer um insert simples como trabalho de pós, numa tabela de vendas, sendo que para vendas para funcionários tem 20% de desconto e pra cliente 10%, porém estou com algumas dificuldades, eu tentei de diversas maneiras como abaixo. Alguém poderia me ajudar?

 

select

CASE

WHEN EXISTS(select cli.codigo from cliente where cli.codigo = 7)THEN

INSERT INTO vendas VALUES(10,7,'02-01-2000 00:10', 100 - (100 * 0.10))

WHEN EXISTS(select fun.codigo from cliente where fun.codigo = 7)THEN

(INSERT into vendas values (12,7,'02-01-2000 00:10', 100 - (100 * 0.20)))

ELSE INSERT INTO vendas(SEQ, CODIGO,DATA, VL_TOTAL) VALUES (13,7,'02-01-2000 00:10', 100)

END as resultado

 

from cliente cli, funcionario fun

 

/*=================================================*/ 3

 

 

 

If Exists(select cli.codigo from cliente where cli.codigo = 7)

Begin

INSERT INTO vendas VALUES(10,7,'02-01-2000 00:10', 100 - (100 * 0.10))

End

Else If Exists(select fun.codigo from funcionario where fun.codigo = 7)

Begin

INSERT into vendas values (12,7,'02-01-2000 00:10', 100 - (100 * 0.20))

End

Else

INSERT INTO vendas(SEQ, CODIGO,DATA, VL_TOTAL) VALUES (13,7,'02-01-2000 00:10', 100)

 

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antonio.

 

No primeiro select, você n pode fazer um insert dentro de um select (pelo menos nunca que tenha visto), apenas um insert com um select. Por isso não iria dar dar certo essa sua lógica.

 

Você precisaria fazer:

 

Insert into vendas values(select)

 

Só que um CASE só pode retornar uma coluna (ou seja, você n poderia fazer select a.campo1, a.campo2 dentro de CASE).

 

Isso se você estiver utilizando SQL puro.

 

 

O seu comando, usando apenas SQL, seria algo assim (não estou com postgres pra testar):

 

insert into vendas values(

   select (CASE
			  WHEN client_codigo IS NOT NULL THEN 10
			  WHEN funcionario_codigo IS NOT NULL THEN 12
			  ELSE 13
		  END)
		  , 7
		  , '02-01-2000 00:10'
		  , 100 - (CASE
					 WHEN client_codigo is not null THEN 
						(100 * 0.10)
					 WHEN funcionario_codigo is not null THEN  
						(100 * 0.20)
					 ELSE 
						0
				   END)
	 from (
			  (select cli.codigo as client_codigo
					  , null as funcionario_codigo
				 from cliente cli
				where cli.codigo = 7) 
		   union
			  (select null as client_codigo
					  , fun.codigo as funcionario_codigo
				 from funcionario fun 
				where fun.codigo = 7)
		  ) as A
)

 

Verifique também seu SQL, estava com join em cliente duas vezes.

 

 

Já o segundo SQL seria para Store Procedure não? Nesse caso, verifique a sintax. Também veja se precisa usar mesmo exists, já q você está filtrandpo por um código. Um coalesce já bastaria ou is not null

 

Um problema que vejo nessa lógica

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa Noite Danilo

 

 

Ficou muito legal desse jeito, só que rodei aqui e está dando o seguinte erro ERROR: syntax error at or near "select"

LINE 3: select (CASE

no select e não consegui tirar

 

Agradeço

 

 

 

Antonio.

 

No primeiro select, você n pode fazer um insert dentro de um select (pelo menos nunca que tenha visto), apenas um insert com um select. Por isso não iria dar dar certo essa sua lógica.

 

Você precisaria fazer:

 

Insert into vendas values(select)

 

Só que um CASE só pode retornar uma coluna (ou seja, você n poderia fazer select a.campo1, a.campo2 dentro de CASE).

 

Isso se você estiver utilizando SQL puro.

 

 

O seu comando, usando apenas SQL, seria algo assim (não estou com postgres pra testar):

 

insert into vendas values(

   select (CASE
			  WHEN client_codigo IS NOT NULL THEN 10
			  WHEN funcionario_codigo IS NOT NULL THEN 12
			  ELSE 13
		  END)
		  , 7
		  , '02-01-2000 00:10'
		  , 100 - (CASE
					 WHEN client_codigo is not null THEN 
						(100 * 0.10)
					 WHEN funcionario_codigo is not null THEN  
						(100 * 0.20)
					 ELSE 
						0
				   END)
	 from (
			  (select cli.codigo as client_codigo
					  , null as funcionario_codigo
				 from cliente cli
				where cli.codigo = 7) 
		   union
			  (select null as client_codigo
					  , fun.codigo as funcionario_codigo
				 from funcionario fun 
				where fun.codigo = 7)
		  ) as A
)

 

Verifique também seu SQL, estava com join em cliente duas vezes.

 

 

Já o segundo SQL seria para Store Procedure não? Nesse caso, verifique a sintax. Também veja se precisa usar mesmo exists, já q você está filtrandpo por um código. Um coalesce já bastaria ou is not null

 

Um problema que vejo nessa lógica

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, tenta

 

insert into vendas

select (case when .....

 

 

É só algum problema de sintaxe e achar a forma correta.

 

Pelo http://www.postgresql.org/docs/8.1/static/sql-insert.html, aparentemente, deve-se usar insert into Tabela select em vez de insert into Tabela values select

 

Cara, funcionou belezinha, só me responde uma pergunta, pra que você colocou null no select do cliente e do funcionário

from (

(select cli.codigo as client_codigo

, null as funcionario_codigo

from cliente cli

where cli.codigo = 7)

union

(select null as client_codigo

, fun.codigo as funcionario_codigo

from funcionario fun

where fun.codigo = 7)

) as A

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu coloquei no select do cliente assim:

 

cli.codigo as client_codigo

, null as funcionario_codigo

 

e no select do funcionario:

 

null as client_codigo

, fun.codigo as funcionario_codigo

 

 

O motivo de eu ter feito isso foi que no seu select original você pegava as duas colunas, cli.codigo e fun.codigo, e fazia o seu case. Então, eu mantive a mesma idéia, sendo o client_codigo a primeira coluna, e a segunda o funcionario_codigo. Para que isso desse certo, seria preciso que a outro coluna fosse nula, até porque, se não fosse, ia entrar no case, coisa que não queremos.

 

Dessa forma, a primeira coluna eu deixei reservada pro cliente e a segunda pro funcionario. Como eu faço uniao do primeiro resultado com o segundo, e o primeiro resultado é exclusivo para cliente (por isso coloco null no funcionario) e o segundo exclusivo do funcionario (por isso coloco null no cliente), fica mais fácil no case saber o que é o que.

 

Se eu tivesse usado apenas uma coluna tanto pro codigo cliente como para funcionario, o seu case não saberia distinguir se é um cliente ou um funcionario. E se eu usasse duas colunas e não nulificasse uma delas, sempre ia entrar no case de cliente, já que na hora de pegar as linhas de funcionario, a ciolyuna do codigo do cliente seria diferente de nulo.

 

Deu para entender mais ou menos minha lógica? Talvez não seja a melhor, mas eu tentei manter a sua idéia original :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu coloquei no select do cliente assim:

 

cli.codigo as client_codigo

, null as funcionario_codigo

 

e no select do funcionario:

 

null as client_codigo

, fun.codigo as funcionario_codigo

 

 

O motivo de eu ter feito isso foi que no seu select original você pegava as duas colunas, cli.codigo e fun.codigo, e fazia o seu case. Então, eu mantive a mesma idéia, sendo o client_codigo a primeira coluna, e a segunda o funcionario_codigo. Para que isso desse certo, seria preciso que a outro coluna fosse nula, até porque, se não fosse, ia entrar no case, coisa que não queremos.

 

Dessa forma, a primeira coluna eu deixei reservada pro cliente e a segunda pro funcionario. Como eu faço uniao do primeiro resultado com o segundo, e o primeiro resultado é exclusivo para cliente (por isso coloco null no funcionario) e o segundo exclusivo do funcionario (por isso coloco null no cliente), fica mais fácil no case saber o que é o que.

 

Se eu tivesse usado apenas uma coluna tanto pro codigo cliente como para funcionario, o seu case não saberia distinguir se é um cliente ou um funcionario. E se eu usasse duas colunas e não nulificasse uma delas, sempre ia entrar no case de cliente, já que na hora de pegar as linhas de funcionario, a ciolyuna do codigo do cliente seria diferente de nulo.

 

Deu para entender mais ou menos minha lógica? Talvez não seja a melhor, mas eu tentei manter a sua idéia original :)

 

 

 

beleza, ENTENDI SIM....

 

TA FUNCIONANDO, MAIS VOU TESTAR NOVAMENTE COM OUTROS VALORES, QUALQUER COISA VOLTO A POSTAR.

 

AGRADEÇO SUA ATENÇÃO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tranquilo.

 

Eu recomendo você fazer um teste so com o select da uniao e depois fazer com o insert global, e comparar pra ver se inseriu o que você queria e etc.

 

Boa sorte

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fui tentar inserir aqui,mas está dando um erro quando o código do cliente e do funcionário são iguais, e como a tabela é feita pra fins de estudo, não tem restrição de chave primaria e está inserindo dobrado, conforme abaixo

 

 

9;6;"02-01-2000 00:10";90.00

9;7;"02-01-2000 00:10";80.00

 

há alguma maneira de usar o mesmo código ou fazer de forma?

 

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.