Array
(
)

Comparação

Josemar Silva
   - 07 mai 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.

Joel Rodrigues
   - 07 mai 2013

Use o distinct. Exemplo:
#Código

SELECT DISTINCT(VALOR) FROM TABELA_A

Pesquise sobre esse operador para entender seu funcionamento.

Guilherme Wiethaus
   - 28 mai 2013

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.

#Código

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:

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


Agora a Exclusão dos registros negativos na tabela D

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

Guilherme Wiethaus
   - 28 mai 2013

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.

#Código

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.

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


5) Deletar a Tabela temporária #C

#Código
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.

Guilherme Wiethaus
   - 28 mai 2013

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

Abraços

Josemar Silva
   - 15 ago 2013

Obrigado pela ajuda de todos.