Comparação

07/05/2013

Boa tarde,

Galera, poderiam me ajudar a resolver um problema que já me acompanha a algum tempo?

Tenho duas tabelas com campos de valores. Uma das tabelas possui valores positivos e a outra negativos.

Em alguns casos, a tabela que possui valores positivos, possui mais registros com mesmo valor da tabela de valores negativos.

A minha dúvida é como faço para que o sistema exclua a mesma quantidade de registros na tabela de valores negativos na de positivo.

Ex:

tabela A(valores positivos)

ID Valor

1 12,30

2 12,30

3 14,00

tabela B(valores negativos)

id valor1

1 -0,90

2 -34,00

3 -12,30

Reparem que acima só poderei excluir um valor na tabela A, (12,30)

Sei que posso usar o ABS para transformar os valores negativos em positivos, mas como excluir a mesma quantidade nas duas tabelas?

Desde já agradeço.

Josemar Silva

Respostas

07/05/2013

Joel Rodrigues

Use o distinct. Exemplo:
SELECT DISTINCT(VALOR) FROM TABELA_A

Pesquise sobre esse operador para entender seu funcionamento.
Responder Citar

28/05/2013

Guilherme Wiethaus

Vou postar aqui a que exclui num dos lados do relacionamento.
Diretamente não tem como fazer isto pois delete usa uma tabela
como referência para excluir os dados da outra num relacionamento.

Existe uma solução para isto que vou postar depois desta idéia.

Usando SQL Server 2008 R2 Express.

CREATE TABLE [dbo].[C](
	[ID] [int] NULL,
	[Valor] [money] NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[D](
	[ID] [int] NULL,
	[Valor] [money] NULL
) ON [PRIMARY]

INSERT [dbo].[C] ([ID], [Valor]) VALUES (1, 10.3000)
INSERT [dbo].[C] ([ID], [Valor]) VALUES (2, 12.4000)
INSERT [dbo].[C] ([ID], [Valor]) VALUES (3, 8.0000)
INSERT [dbo].[C] ([ID], [Valor]) VALUES (4, 10.4500)
INSERT [dbo].[D] ([ID], [Valor]) VALUES (1, -10.3000)
INSERT [dbo].[D] ([ID], [Valor]) VALUES (2, -9.0000)
INSERT [dbo].[D] ([ID], [Valor]) VALUES (3, -10.3000)
INSERT [dbo].[D] ([ID], [Valor]) VALUES (4, -10.3100)
INSERT [dbo].[D] ([ID], [Valor]) VALUES (5, -10.3150)



Execute entao o Codigo para visualizar os dados na tabela que são negativos em correspondencia com os dados que são positivos:

SELECT D.* FROM D INNER JOIN C ON C.Valor = ABS(D.Valor);


Agora a Exclusão dos registros negativos na tabela D

DELETE D FROM D INNER JOIN C ON C.Valor = ABS(D.Valor);
Responder Citar

28/05/2013

Guilherme Wiethaus

Agora a outra maneira de excluir ambos os lados é fazer através de Trigger (gatilho).

Vamos por parte como dizia Jack o Estripador.

1) criar uma tabela temporária #C.
2) Armazenar a chave única de registro (ID) da tabela C em uma tabela temporária #C.
3) Excluir então os registros da tabela D, a qual mencionei no ultimo post.

DELETE D FROM D INNER JOIN C ON C.Valor = ABS(D.Valor);


4) Fazer o relacionamento da tabela temporária #C com a tabela física C e fazer Delete.

DELETE C FROM C INNER JOIN #C ON #C.ID = C.ID;


5) Deletar a Tabela temporária #C

DROP TABLE #C


Pronto, a exclusão foi feita quando deletar da tabela D os seus Dados negativos correspondentes a tabela C que tem os dados positivos estes tambem serão excluídos.

Abraços.
Responder Citar

28/05/2013

Guilherme Wiethaus

Não mostrei o código do ítem 2 pois acho que saiba como fazer.

Abraços
Responder Citar

15/08/2013

Josemar Silva

Obrigado pela ajuda de todos.
Responder Citar