2013-11-23 73 views
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表包含文檔和標籤表FK的。現在,我必須選擇那些標籤帶有8或2和其他ID(例如:45,32,15)標籤的文檔,並且當我在該表中找到該文檔時,我必須插入[DocId | 3000],其中3000是新標籤的標識。

換句話說,我必須選擇屬於HomePage或Private以及提到的發佈者之一的文檔併爲該文檔分配新標籤。

我有數以百萬計的文件和數百個標籤,以及72個不同的發行者,所以我想我必須爲每個發行者執行72次查詢。

對於選擇查詢 「IssuerNameOne」 的結果應該是:

DocId 
    10  

由於8和45 TagIds。

對於選擇查詢 「IssuerNameTwo」 的結果應該是:

DocId 
    11 
    13 

由於2,8和15 TagIds。

插入執行後,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 

回答

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) 

Fiddle

+0

謝謝您的幫助。它看起來像一個工作解決方案,不幸的是我不能在星期一之前測試它,所以我會在稍後發佈。 再次感謝。 – bajicdusko

+0

雖然我放棄了插入新標籤的解決方案,但這是正確的答案。 @Mark答案几乎相同。由於語法更清晰,這一個被加入。 謝謝。 – bajicdusko

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); 
+0

謝謝馬克。基本上它與@TI提交的解決方案是一樣的,所以我想它是100%的工作解決方案。我不能在星期一之前測試它,所以我會讓你知道發生了什麼事情:)。 – bajicdusko

相關問題