2012-03-26 59 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