3

グリッドにデータを表示するために作成しなければならない SQL リクエストに問題があります。

以下のような一時テーブルがあります(例では、メールアドレスの代わりに数字を入れています):

GroupID | Email1 | Email2 
null    |   1    | 2
null    |   1    | 2
null    |   1    | null
null    |   3    | 1
null    |   2    | 2
null    |   4    | 2
null    |   5    | 6
null    |   6    | null

以下で説明するように、GroupID を設定するためにテーブルを更新する必要があります。email1 または email2 が他のレコードと一致する場合、このレコードは他のレコードと同じ groupId を持つ必要があります。例(上の表を使用):

GroupID | Email1 | Email2
**1**   |   1    | 2
**1**   |   1    | 2
**1**   |   1    | null
**1**   |   3    | 1
**1**   |   2    | 2
**1**   |   4    | 2
**2**   |   5    | 6
**2**   |   6    | null

私はそのようなことを試しました:

UPDATE a
SET a.GroupId = b.GroupId
FROM   #temp a
INNER JOIN (SELECT Email, 
                   ROW_NUMBER() OVER (ORDER BY ISNULL(Email,'zzzzzzzz')) GroupId
            FROM (SELECT Email1 Email
                  FROM #temp
                  GROUP BY Email1
                  UNION ALL 
                  SELECT Email2 Email   
                  FROM #temp                
                  GROUP BY Email2 
                 ) c
            GROUP BY Email
           ) b
ON a.Email1 = b.Email OR
   a.Email2 = b.Email OR 
   (b.Email IS NULL AND a.Email1 IS NULL AND a.Email2 IS NULL)

しかし、これは私が意図している機能ではありません...たとえば、Eメール1と等しいのがEmail2である場合、同じグループとして認識されません...どうすればこのリクエストを希望どおりに機能させることができますか? それは可能ですか??

[編集] 2013/15/17 14:15 :実際には、ルールについては、「email1またはemail 2が他のレコードのemail1またはemail2と一致する場合、同じgroupIDである必要があります」という意味でした

4

1 に答える 1