SQL Server - вставить в с помощью select и union - дубликаты вставляются - PullRequest
0 голосов
/ 26 марта 2012

Когда я выполняю «выбор объединения», я получаю правильное число или строки (156) Выполненный независимо, выбор # 1 возвращает 65 строк, а выбор # 2 возвращает 138 строк.

Когда я использую этот «выбор объединения» со вставкой в, я получаю 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)
            )
    )

Буду признателен за решение этой проблемы ...

Спасибо!

1 Ответ

0 голосов
/ 26 марта 2012

Ключевое слово UNION должно возвращать только разные записи между двумя запросами. Однако, если я правильно помню, это верно только в том случае, если типы данных совпадают. Переменные даты могут быть причиной этого. В зависимости от типа сортировки, пробелы также могут обрабатываться по-разному. Возможно, вы захотите сделать SELECT DISTINCT для таблицы dpapm_MediaObjectValidation после выполнения вставки, но при сравнении обязательно обрежьте пробелы с обеих сторон. Другой подход заключается в том, чтобы выполнить первую вставку, а затем - на второй вставке, вообще отказаться от UNION и выполнить ручную проверку EXISTS, чтобы увидеть, существуют ли элементы для вставки, которые уже существуют.

...