2012-03-26 9 views
0

"select union select"を実行すると、正しい番号または行が得られます #1が選択されて65行を返し、#2を選択します138行を返します。SQL Server - 選択したユニオンの重複を挿入して挿入する

私がこの「select union select」を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'ステートメントは、' INSERT INTO ... SELECT'で使用されたときに同じ結果を返さなければなりません。自分のテーブルに挿入するのに比べてクエリ自体が異なる結果を返すことは確かですか?それは私にとって可能ではないようです... –

+0

はい、私は選択と組合が大丈夫だと確信しています。だから私はそれが何らかの「操作の順序」の問題かどうか疑問に思います。しかし、私はもう少しテストを行いました.SQLServerからsprocを直接呼び出しても結果はOKではありませんが、クエリでコードを実行するとうまくいきます。 – crichard

答えて

0

UNIONキーワードは、2つのクエリ間で異なるレコードのみを返す必要があります。しかし、正しくリコールすると、データ型が同じである場合にのみ当てはまります。日付変数がそれを投げているかもしれません。照合タイプによっては、空白の扱いも異なる場合があります。挿入を行った後にdpapm_MediaObjectValidationテーブルでSELECT DISTINCTを実行したい場合は、比較の際に両側の空白を切り取ってください。もう1つの方法は、最初の挿入を行い、次に2番目の挿入で、UNIONを完全に削除し、挿入するアイテムがすでに存在するかどうかを手動EXISTSで確認します。

+0

私はあなたの2番目のソリューションを使用するように私のsprocを変更しました(2つのインサートで存在します)。それはトリックを行うようだ。これが大きなパフォーマンスヒットであれば分かりますか? – crichard

+0

通常、照会しているデータセットが巨大でない場合は表示されません。私は個人的にこのようなトリックを使用するのが好きではありませんが、時には期待どおりに動作しないために選択肢がありません。しかし、次のstackoverflowの投稿によると、EXISTSキーワード自体を使用すると負荷の一部を減らすのに役立ちます - > http://stackoverflow.com/questions/2065329/sql-server-in-vs-exists-performance –

関連する問題