2016-03-23 14 views
0

SQL ServerテーブルAは、テーブルBとCを持つ1対多で、Aの1エントリは外部キーを使用してBとCに多くのエントリを持つことができます。プライマリキー入力に基づく重複データの特定

Aの主キーをストアドプロシージャに渡しています。入力されたABCリレーションシップがデータベース内のABCのリレーションと重複するデータを持っているかどうかを確認したいと思います。

重複の条件は次のとおりです。

入力の行のBC列データも別のAエントリのデータベースに存在する場合、A`を呼び出し、BC`はBCの複製であり、A'はAの複製です。 Aの主キーを返します。

これまでのところ、私は宣言型言語でこれを行う方法を決定することに固執しています。私の最新の試みはC.

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 ... 

内の既存のBの列に問題があるこれは私を切り株「は、入力として、」下の赤い線になります。

誰でもこの問題へのアプローチ方法についてアドバイスをいただけますか?ありがとうございました。 (私は右のあなたのタスクを持っている場合)は、このような

+4

[キックする悪い習慣:古いスタイルを使用してJOINの]である(のhttp:// sqlblog古いスタイルの*カンマで区切られたテーブル*スタイルのリストが、以下のように置き換えられました:.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx ANSI - ** 92 ** SQL標準(** 20年以上前**)の*適切な* ANSI 'JOIN'構文とその使用はお勧めしません –

+0

" red squiggly line "あなたがそれの上にマウスを置いたとき? –

+1

エイリアスの「input」は列名に2倍です。禁止されています。 *列名をエイリアスで明示的に使用する代わりに使用します。 (例 - テーブルにはフィールド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 
関連する問題