2012-03-26 61 views
0

重複當我執行我的「選擇聯盟選擇」,我得到正確的行數(156) 獨立執行,選擇#1返回65行,並選擇#2返回138行。SQL服務器 - 將與選擇和工會 - 插入

當我使用「選擇聯盟選擇」用INSERT INTO,我得到203行(65 + 138)與重複。

我想知道這是否是導致這個問題我的代碼結構?

INSERT INTO dpapm_MediaObjectValidation (mediaobject_id, username, checked_date, expiration_date, notified) 

    (SELECT FKMediaObjectId, CreatedBy,@checkdate,dateadd(ww,2,@checkdate),0 
    FROM dbo.gs_MediaObjectMetadata 
    LEFT JOIN gs_MediaObject mo 
    ON gs_MediaObjectMetadata.FKMediaObjectId = mo.MediaObjectId 
    WHERE UPPER([Description]) IN ('CAPTION','TITLE','AUTHOR','DATE PHOTO TAKEN','KEYWORDS') 
    AND FKMediaObjectId >= 
     (SELECT TOP 1 MediaObjectId 
      FROM dbo.gs_MediaObject 
      WHERE DateAdded > @lastcheck 
      ORDER BY MediaObjectId) 
    GROUP BY FKMediaObjectId, CreatedBy 
    HAVING count(*) < 5 

    UNION 

    SELECT FKMediaObjectId, CreatedBy,getdate(),dateadd(ww,2,getdate()),0 
    FROM gs_MediaObjectMetadata yt 
    LEFT JOIN gs_MediaObject mo 
    ON yt.FKMediaObjectId = mo.MediaObjectId 
    WHERE UPPER([Description]) = 'KEYWORDS' 
    AND FKMediaObjectId >= 
     (SELECT TOP 1 MediaObjectId 
      FROM dbo.gs_MediaObject 
      WHERE DateAdded > @lastcheck 
      ORDER BY MediaObjectId) 
    AND NOT EXISTS 
      (
      SELECT * 
      FROM dbo.fnSplit(Replace(yt.Value, '''', ''''''), ',') split 
      WHERE split.item in (SELECT KeywordEn FROM gs_Keywords) or split.item in (SELECT KeywordFr FROM gs_Keywords) 
      ) 
    ) 

我將不勝感激任何線索爲解決這個問題...

謝謝!

+3

自身產生的'SELECT'語句應返回相同的結果。你確定查詢返回不同的結果時,它自己執行,而不是用於插入到您的表中嗎?這對我來說似乎是不可能的...... – 2012-03-26 18:20:22

+0

是的,我確定選擇和聯盟是可以的。這就是爲什麼我想知道這是否是某種「操作順序」問題。但是我只是做了一些更多的測試,如果我直接從SQLServer調用我的sproc,結果不好,但是當我在查詢中運行代碼時,它工作正常。 – crichard 2012-03-26 18:25:18

回答

0

的UNION關鍵字應該只返回兩個查詢之間不重複的記錄。但是,如果我沒有記錯,只有數據類型相同纔是真實的。日期變量可能會拋棄。根據整理類型的不同,空白處理也可能不同。在插入後,您可能希望在dpapm_MediaObjectValidation表上執行SELECT DISTINCT,但一定要在比較中修剪兩邊的空白。另一種方法是先進行第一次插入,然後在第二次插入中完全放棄UNION,然後執行手動EXISTS檢查以查看要插入的項目是否已存在。在`INSERT INTO ... SELECT`使用時

+0

我修改了我的sproc以使用第二個解決方案(存在2個插入)。這似乎是訣竅。你知道這是否是一個很大的表現? – crichard 2012-03-26 18:42:50

+0

通常情況下,如果您要查詢的數據集不是很大。我個人不喜歡使用這樣的技巧,但有時你沒有選擇,因爲事情不像預期的那樣行事。然而,根據下面的計算器後,使用EXISTS關鍵字本身應該有助於減少一些負載 - > http://stackoverflow.com/questions/2065329/sql-server-in-vs-exists-performance – 2012-03-26 20:16:14