1

次のようなテーブルがあります

CREATE TABLE [dbo].[MyTable](
    [MyTableID]    [int]           IDENTITY(1,1) NOT NULL,
    [ContainerID]  [int]           NOT NULL,
    [FIELD_A]      [nvarchar](15)  NOT NULL,
    [FIELD_B]      [nvarchar](15)  NOT NULL,
    [FIELD_C]      [nvarchar](15)  NOT NULL,
    [FIELD_D]      [nvarchar](50)  NULL,
 CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED ( [MyTableID] ASC )
    WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
    ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]

簡単に言うと、、、およびは。でグループ化されFIELD_Aます。FIELD_BFIELD_CFIELD_DContainerID

各コンテナには約2kのレコードが含まれていることを考慮して、2つの間の違いを返すクエリを実行したいと思いますContainerID。たとえば、コンテナ1とコンテナ2を比較するとき、次のことを知る必要があります。

  • 1に存在し、2には存在しない、またはその逆のレコードの数
  • 両方のコンテナーに存在するレコードの数

これらの結果を得る最も簡単な方法はどれですか?ありがとう!

4

2 に答える 2

2

ここにスタートがあります:

-- rows for 1 but not in 2:

SELECT FIELD_A, FIELD_B, FIELD_C, FIELD_D FROM dbo.MyTable WHERE ContainerID = 1
EXCEPT
SELECT FIELD_A, FIELD_B, FIELD_C, FIELD_D FROM dbo.MyTable WHERE ContainerID = 2;

-- rows for 2 but not in 1:

SELECT FIELD_A, FIELD_B, FIELD_C, FIELD_D FROM dbo.MyTable WHERE ContainerID = 2
EXCEPT
SELECT FIELD_A, FIELD_B, FIELD_C, FIELD_D FROM dbo.MyTable WHERE ContainerID = 1;

-- rows in both:

SELECT FIELD_A, FIELD_B, FIELD_C, FIELD_D FROM dbo.MyTable WHERE ContainerID = 1
INTERSECT
SELECT FIELD_A, FIELD_B, FIELD_C, FIELD_D FROM dbo.MyTable WHERE ContainerID = 2;
于 2012-09-12T14:42:32.787 に答える
1

これは機能するはずです。「field_x」フィールドの4つすべてにインデックスを付ける必要がありますが、それでも迅速ではありません。

SELECT isnull(t1.Field_A,t2.Field_A) Field_A, isnull(t1.Field_B,t2.Field_B) Field_B
, isnull(t1.Field_C,t2.Field_C) Field_C, isnull(t1.Field_D,t2.Field_D) Field_D
,CASE WHEN t1.MyTableId IS NULL THEN 1 ELSE 0 END
,CASE WHEN t2.MyTableId IS NULL THEN 1 ELSE 0 END
FROM
(SELECT * FROM MyTable WHERE ContainerId=@ContainerId1) t1
FULL OUTER JOIN 
(SELECT * FROM MyTable WHERE ContainerId=@ContainerId2) t2
ON t1.Field_A=t2.Field_A AND t1.Field_B=t2.Field_B 
AND t1.Field_C=t2.Field_C AND t1.Field_D=t2.Field_D
于 2012-09-12T14:46:33.350 に答える