如何确保数据不会插入到数据已经存在的表中?

1 sql-server insert t-sql

我创建了一个查询,我想将结果插入到另一个表中。它将每天作为作业运行,导入的数据仍将保留在结果集中。如果数据已存在于目标表中,我不希望导入数据。查询如下所示:

WITH cteUniquePages
(
CorrelationID,
Title,
URL,
HitDate,
TotalVisitsOnDate,
DontUseThisDate)
AS
(
    SELECT DISTINCT
    CorrelationID,
    Title, 
    URL,
    HitDate,
    COUNT(HitDate) OVER (PARTITION BY URL, HitDate) 'TotalVisitsOnDate',
    CAST(LogTime AS date) 'DontUseThisDate'
    FROM
        (SELECT
        CorrelationId,
        UserLogin,
        LogTime,
        Title,
        CONCAT(
            (CASE 
                WHEN WebUrl <> '' THEN CONCAT(ServerUrl,'/') ELSE ServerUrl END), 
            WebUrl,DocumentPath) 'URL',
        CONCAT(
            CASE
                WHEN (LEN(DATEPART(day,LogTime)))=1 THEN CONCAT('0',DATEPART(day,LogTime)) END,
            CASE
                WHEN (LEN(DATEPART(day,LogTime)))=2 THEN (DATEPART(day,LogTime)) END,'-', 
            CASE 
                WHEN (LEN(DATEPART(month,LogTime)))=1 THEN CONCAT('0',DATEPART(month,LogTime)) END,
            CASE
                WHEN (LEN(DATEPART(month,LogTime)))=2 THEN (DATEPART(month,LogTime)) END,
            '-', DATEPART(year,LogTime)) 'HitDate'
        FROM WSS_Logging.dbo.RequestUsage
        WHERE UserLogin <> 'nt authority\iusr' 
        AND UserLogin <> 'i:0#.w|pfnet\zz_sharepoint13' 
        AND DocumentPath LIKE '%.aspx' 
        AND DocumentPath NOT LIKE '%/_layouts/%'
        AND UserLogin <> 'PFNET\E01BrownS'
        AND UserLogin <> 'i:0#.w|pfnet\sharepointtestacc1'
        GROUP BY UserLogin, WebUrl, DocumentPath, LogTime, Title, ServerUrl,CorrelationId) as a
),
    cteVisitsAllTime
    (
        CorrelationID,
        LogTime,
        Title,
        URL, 
        TotalVisits
    )
    AS
    (
        SELECT DISTINCT
        CorrelationID,
        LogTime, 
        Title,
        URL,
        COUNT(URL) OVER (PARTITION BY URL) 'TotalVisits' 
        FROM(
            SELECT 
            CorrelationId,
            Title,
            CONCAT(
                (CASE 
                    WHEN WebUrl <> '' THEN CONCAT(ServerUrl,'/') ELSE ServerUrl END), 
                WebUrl,DocumentPath) 'URL', 
                LogTime 
            FROM WSS_Logging.dbo.RequestUsage
            WHERE UserLogin <> 'nt authority\iusr' 
            AND UserLogin <> 'i:0#.w|pfnet\zz_sharepoint13' 
            AND DocumentPath LIKE '%.aspx' 
            AND DocumentPath NOT LIKE '%/_layouts/%'
            AND UserLogin <> 'PFNET\E01BrownS'
            AND UserLogin <> 'i:0#.w|pfnet\sharepointtestacc1') as a
    ),
    cteVisitsLast7Days
    (
        CorrelationID,
        Title,
        URL, 
        TotalVisits
    )
    AS
    (
        SELECT
        CorrelationID, 
        Title,
        URL,
        COUNT(URL) OVER (PARTITION BY URL) 'TotalVisits' 
        FROM(
            SELECT 
            CorrelationId,
            Title,
            CONCAT(
                (CASE 
                    WHEN WebUrl <> '' THEN CONCAT(ServerUrl,'/') ELSE ServerUrl END), 
                WebUrl,DocumentPath) 'URL', 
                LogTime 
            FROM WSS_Logging.dbo.RequestUsage
            WHERE UserLogin <> 'nt authority\iusr' 
            AND UserLogin <> 'i:0#.w|pfnet\zz_sharepoint13' 
            AND DocumentPath LIKE '%.aspx' 
            AND DocumentPath NOT LIKE '%/_layouts/%'
            AND UserLogin <> 'PFNET\E01BrownS'
            AND UserLogin <> 'i:0#.w|pfnet\sharepointtestacc1') as a
            WHERE LogTime >= DATEADD(day,-7, GETDATE())
    ),
    cteVisitsLast30Days
    (
        CorrelationID,
        Title,
        URL, 
        TotalVisits
    )
    AS
    (
        SELECT
        CorrelationID, 
        Title,
        URL,
        COUNT(URL) OVER (PARTITION BY URL) 'TotalVisits' 
        FROM(
            SELECT
            CorrelationId, 
            Title,
            CONCAT(
                (CASE 
                    WHEN WebUrl <> '' THEN CONCAT(ServerUrl,'/') ELSE ServerUrl END), 
                WebUrl,DocumentPath) 'URL', 
                LogTime 
            FROM WSS_Logging.dbo.RequestUsage
            WHERE UserLogin <> 'nt authority\iusr' 
            AND UserLogin <> 'i:0#.w|pfnet\zz_sharepoint13' 
            AND DocumentPath LIKE '%.aspx' 
            AND DocumentPath NOT LIKE '%/_layouts/%'
            AND UserLogin <> 'PFNET\E01BrownS'
            AND UserLogin <> 'i:0#.w|pfnet\sharepointtestacc1') as a
            WHERE LogTime >= DATEADD(day,-30, GETDATE())
    ),
    cteVisitsLastYear
    (
        CorrelationID,
        Title,
        URL, 
        TotalVisits
    )
    AS
    (
        SELECT
        CorrelationID, 
        Title,
        URL,
        COUNT(URL) OVER (PARTITION BY URL) 'TotalVisits' 
        FROM(
            SELECT
            CorrelationId, 
            Title,
            CONCAT(
                (CASE 
                    WHEN WebUrl <> '' THEN CONCAT(ServerUrl,'/') ELSE ServerUrl END), 
                WebUrl,DocumentPath) 'URL', 
                LogTime 
            FROM WSS_Logging.dbo.RequestUsage
            WHERE UserLogin <> 'nt authority\iusr' 
            AND UserLogin <> 'i:0#.w|pfnet\zz_sharepoint13' 
            AND DocumentPath LIKE '%.aspx' 
            AND DocumentPath NOT LIKE '%/_layouts/%'
            AND UserLogin <> 'PFNET\E01BrownS'
            AND UserLogin <> 'i:0#.w|pfnet\sharepointtestacc1') as a
            WHERE LogTime >= DATEADD(day,-365, GETDATE())
    )
SELECT DISTINCT 
cteUniquePages.Title,
cteUniquePages.URL,
cteUniquePages.HitDate,
cteUniquePages.TotalVisitsOnDate,
cteVisitsAllTime.TotalVisits 'All Time Visits',
cteVisitsLast7Days.TotalVisits 'Visits Last 7 Days',
cteVisitsLast30Days.TotalVisits 'Visits Last 30 Days',
cteVisitsLastYear.TotalVisits 'Visits Last Year',
cteUniquePages.DontUseThisDate
FROM cteUniquePages
LEFT JOIN cteVisitsAllTime ON cteVisitsAllTime.CorrelationID = cteUniquePages.CorrelationID
LEFT JOIN cteVisitsLast7Days ON cteVisitsLast7Days.CorrelationID = cteUniquePages.CorrelationID
LEFT JOIN cteVisitsLast30Days ON cteVisitsLast30Days.CorrelationID = cteUniquePages.CorrelationID
LEFT JOIN cteVisitsLastYear ON cteVisitsLastYear.CorrelationID = cteUniquePages.CorrelationID
ORDER BY DontUseThisDate DESC, cteUniquePages.URL
Run Code Online (Sandbox Code Playgroud)

Dav*_*ett 5

为此,有几个选项:

  1. WHERE NOT EXISTS (SELECT * FROM <target_table> WHERE <matching_predicates> )INSERT ... SELECT ...语句中添加子句。但请确保您使用真实数据模式进行测试,就像使用相对复杂的数据一样。
  2. LEFT OUTER JOIN到目标表并添加一个WHERE target_table.primarykey IS NULL子句 - 如果外连接没有找到匹配的行,这将是假的。通常这会产生相同的计划,就WHERE NOT EXISTS好像它可能因复杂查询而异。如果存在性能差异(我已经看到该JOIN变体的性能更好)WHERE NOT EXISTS尽管这是几个引擎版本之前的),请使用生成更好计划的查询,否则使用您发现更易于阅读和维护的查询。
  3. 使用MERGE而不是 plain INSERT,尽管如果您想更新现有行而不是复制它们,这是最有用的。