0

この質問のタイトルが意味をなすかどうかはわかりませんが、私の問題を説明させてください。

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

DocTag テーブル

DocId | TagId
   10 | 8
   10 | 45
   11 | 2
   11 | 15
   12 | 9
   12 | 32
   13 | 8
   13 | 15

タグテーブル

TagId | TagName
    8 | HomePage
    2 | Private
   45 | IssuerNameOne
   15 | IssuerNameTwo
   32 | IssuerNameThree
    9 | TagThatNeedsToBeSkipped
 3000 | NewTag

DocTag テーブルには、Document テーブルと Tag テーブルからの FK が含まれています。ここで、ID 8 または 2 と他の ID のいずれか (例: 45、32、15) を持つタグを持つドキュメントを選択する必要があります。このテーブルでドキュメントが見つかったら、[DocId | DocId | 3000]、ここで 3000 は新しいタグの ID です。

つまり、HomePage または Private に属するドキュメントと、言及された発行者の 1 つを選択し、そのドキュメントに新しいタグを割り当てる必要があります。

数百万のドキュメントと数百のタグ、72 の異なる発行者があるため、すべての発行者に対してクエリを 72 回実行する必要があると思います。

「IssuerNameOne」の場合、選択クエリの結果は次のようになります。

DocId
   10       

TagId が 8 個と 45 個あるためです。

「IssuerNameTwo」の場合、選択クエリの結果は次のようになります。

DocId
   11
   13

2、8、および 15 個の TagId が原因です。

挿入の実行後、DocTag は次のようになります。

DocId | TagId
   10 | 8
   10 | 45
   11 | 2
   11 | 15
   12 | 9
   12 | 32
   13 | 8
   13 | 15
   10 | 3000
   11 | 3000
   13 | 3000
4

2 に答える 2

1
insert into DocTag  
select d.docId, 3000 from DocTag d
join DocTag d1 on d1.docId = d.docId and d1.tagId in (45, 32, 15)
 where d.tagId in (8, 2)
and not exists (select * from DocTag where docId = d.docId);
于 2013-11-23T11:03:54.457 に答える