2016-03-23 4 views
0

У меня есть таблица SQL Server A, которая от 1 до многих с таблицами B и C, так что 1 запись в A может иметь много записей в B и C через внешний ключ.Определение дублированных данных на основе ввода первичного ключа

Я передаю первичный ключ A в мою хранимую процедуру, из которой я хочу определить, имеют ли входные ABC-отношения дубликаты данных для любых отношений ABC в базе данных.

Условие дублирования заключается в следующем.

Если данные столбца BC строк ввода также существуют в базе данных для другой записи A, мы будем называть A`, тогда BC` является дубликатом BC и A 'является дубликатом A. Процедура должен возвращать первичный ключ.

До сих пор я застрял в определении того, как это сделать на декларативном языке. Моя последняя попытка имеет проблемы с столбцами В существующих в С.

DECLARE @InputAPrimaryKey INT 

SELECT B.APrimaryKey 
FROM B, C 
JOIN(SELECT * 
    FROM B, C 
    WHERE B.APrimaryKey = C.APrimaryKey 
    AND B.AprimaryKey = @InputAPrimaryKey) As input 
    ON input.Bcolumndata = B.columndata 
    AND input.Ccolumndata = C.columndata 
    AND ... 

Это приводит к красной линии под «в качестве входных данных», которые пни меня.

Может ли кто-нибудь дать совет о том, как подойти к этой проблеме? Спасибо.

+4

[Плохие привычки пинают: использование старого стиля JOIN и] (HTTP: // sqlblog .com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - стиль старого стиля * разделенных запятыми таблиц * был заменен на * правильный * ANSI 'JOIN' синтаксис в ANSI - ** 92 ** SQL Standard (** более 20 лет ** назад), и его использование не рекомендуется –

+0

Ну, что делает« красная squiggly line »sa когда вы наводите на него курсор? –

+1

Ваш псевдоним «input» имеет двойные имена в именах столбцов. Это запрещено. Вместо * используйте explisit имена столбцов (с псевдонимом). (Пример - ваши таблицы содержат поля APrimaryKey) – DimaSUN

ответ

1

Try-л, как этот (если я правильно вашу задачу)

set nocount on 

declare @A table (APrimaryKey int not null) 
insert @A values (1),(2),(3) 

declare @B table (APrimaryKey int not null, ColumnData nvarchar(10)) 

insert @B values (1,'one'),(1,'four'),(3,'three'),(3,'four') 

declare @C table (APrimaryKey int not null, ColumnData nvarchar(10)) 

insert @C values (1,'one'),(1,'two'),(2,'three'),(3,'two') 

declare @Ainit integer = 1 

select distinct B.APrimaryKey 
from @B B 
join @C C on B.APrimaryKey = C.APrimaryKey 
where exists (select B1.APrimaryKey 
       from @B B1 
       join @C C1 
       on B1.APrimaryKey = C1.APrimaryKey 
       and B1.APrimaryKey <> @Ainit 

       and B1.ColumnData = B.ColumnData 
       and C1.ColumnData = C.ColumnData 
       -- Put your additional conditions 
) 
and B.APrimaryKey <> @Ainit 

Результат

APrimaryKey 
----------- 
    3 
Смежные вопросы