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 | 3000],其中 3000 是新标签的 id。

换句话说,我必须选择属于 HomePage 或 Private 的文档以及提到的发行者之一,并为该文档分配新标签。

我有数百万个文档和数百个标签,以及 72 个不同的发行者,所以我想我必须为每个发行者执行 72 次查询。

对于“IssuerNameOne”,选择查询的结果应该是:

DocId
   10       

因为有 8 个和 45 个 TagId。

对于“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  (DocId,TagId)
SELECT DISTINCT DocId, 3000
FROM DocTag  t1 
WHERE TagId IN(8,2)
-- Check the DocId also has a TagId `IN(45,32,15)`
AND EXISTS (SELECT 1 FROM DocTag  t2 
            WHERE t2.DocId=t1.DocId AND t2.TagId IN(45,32,15))
-- Check the new tag mapping doesn't already exists
AND NOT EXISTS(SELECT 1 FROM DocTag  t3 
               WHERE t3.DocId=t1.DocId AND t3.TagId=3000)

小提琴

于 2013-11-23T10:58:20.230 回答
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 回答