0

2 つのテーブルの内容をチェックするビジネス検証ルールを実装する必要があります。ルールには 3 つの部分があります。

  1. table1 のすべての行が table 2 の行と一致する場合、検証に合格する必要があります
  2. table1 のすべての行が table2 の行と一致しない場合は、パスする必要があります。
  3. table1 の行の一部が table2 に結合し、他の行が結合しない場合、失敗するはずです。

以下に 3 つのデータセットを追加して、いつ成功し、いつ失敗するかを示します。

データセット 1 (これはパスするはずです):

Table1
ID   Other Column
1    xxxx
2    xxxx
3    xxxx
4    xxxx

Table2
ID    FK   OtherColumn
1     1    xxxx
2     2    xxxx
3     3    xxxx
4     4    xxxx

データセット 2 (これはパスするはずです):

Table1
ID   Other Column
1    xxxx
2    xxxx
3    xxxx
4    xxxx

Table2
ID    FK   OtherColumn
1     5    xxxx
2     6    xxxx
3     7    xxxx
4     8    xxxx

データセット 3 (テーブル 1 の ID 2 と 3 がテーブル 2 の FK と一致しないため、これは失敗するはずです):

Table1
ID   Other Column
1    xxxx
2    xxxx
3    xxxx
4    xxxx

Table2
ID    FK   OtherColumn
1     1    xxxx
2     5    xxxx
3     6    xxxx
4     4    xxxx

次のようにして、2 つのテーブルを結合できます。

SELECT *
FROM Table1
INNER JOIN Table2
ON Table1.ID = Table2.FK

Table2の各レコードに対して 0 または 1 レコードが含まれます。Table1

これまでのところ、これを行う方法を見つけた唯一の方法は、選択して行数を比較することです。

SELECT COUNT(Table1.ID)
FROM Table1
INNER JOIN Table2
ON Table1.ID = Table2.FK

そして比較して

SELECT COUNT(Table1.ID)
FROM Table1

うまくいくと思いますが、これを行うより簡単な方法があるべきだと感じています。

違いがある場合、データベースは Microsoft SQL 2008 です

4

2 に答える 2

1

あなたはこれを行うことができます:

SELECT count(distinct t1.id) as NumInT1, count(distinct t2.fk) as NumInT2andT1
FROM Table1 t1 left join
     Table2 t2
     ON t1.ID = t2.FK;

Table2の値が重複していないことがわかっている場合は、次のFKように簡略化できます。

SELECT count(t1.id) as NumInT1, count(t2.fk) as NumInT2andT1
FROM Table1 t1 left join
     Table2 t2
     ON t1.ID = t2.FK;

がまたはNumInT2andT1に等しい場合にパスをテストします。NumInT10

于 2013-08-14T03:37:35.573 に答える
0

これは失敗するべきではありませんか?ID 4 が一致し、一致するのは 1 つだけだからです

Dataset 2 (This should pass):

Table1
ID   Other Column
1    xxxx
2    xxxx
3    xxxx
4    xxxx

Table2
ID    FK   OtherColumn
1     4    xxxx
2     5    xxxx
3     6    xxxx
4     7    xxxx

とにかく、行の COUNT で制御できるかもしれません。プロシージャまたはトリガーで使用できる疑似コードを作成します

DECLARE @matchRows int;
DECLARE @normalRows int;

SELECT @matchRows=COUNT(*)
FROM Table1 t1 JOIN Table2 t2 ON t1.id = t2.FK

SELECT @normalRows=COUNT(*)
FROM Table1 t1

IF(@matchRows>0)
BEGIN
     IF(@matchRows<@normalRows)
     BEGIN
          -Here your code in case of fail!
     END
END

あなたはできるかもしれません

DECLARE @booleanControl BIT;

SELECT @booleanControl = CAST(
   CASE WHEN EXISTS(SELECT *
                    FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.ID = t2.KF
                    WHERE COUNT(t1.ID) = COUNT(t2.FK) OR COUNT(t2.FK) = 0
                    ) THEN 1 
                    ELSE 0 
   END 
   AS BIT)

この booleanControl が TRUE を返す場合、彼は通過できますが、それ以外の場合は通過しません

于 2013-08-14T03:49:20.533 に答える