2016-05-04 9 views
1

Ich habe diesen SQL Server-Code. Alles funktioniert, außer dupliziert Zeilen mit gleichen RightsId und UserId. Die Klausel where not exists funktioniert nicht. Jede Hilfe wird geschätzt.einfügen in auswählen von inneren Join wo nicht existiert

INSERT INTO dbo.UserAccessRights (Id, UserId, RightType, RightsId, CreatedOn, CreatedBy) 
    SELECT DISTINCT 
     NEWID(), 
     @changedUserId, 
     N'Process ' + @rightsTypeSuffix, 
     ptm.ProcessInstance_id, 
     getdate(), 
     @loggedInUserId 
    FROM 
     dbo.ProcessTeamMembers ptm WITH (NOLOCK) 
    INNER JOIN 
     dbo.Users u WITH (NOLOCK) ON ptm.TeamMemberProfile_id = u.ProfileID 
            AND u.Id = @changedUserId 
            AND ptm.TenantId = @tenantId 
    INNER JOIN 
     dbo.ProcessInstances p_i WITH (NOLOCK) ON p_i.Id = ptm.ProcessInstance_id 
               AND p_i.DeletedOn IS NULL 
    WHERE 
     NOT EXISTS (SELECT * 
        FROM UserAccessRights uar WITH (NOLOCK) 
        WHERE uar.UserId = @changedUserId 
         AND uar.RightsId = ptm.ProcessInstance_id) 
+3

Set [Schlechte Angewohnheiten, NOLOCK überall hinzuschieben] (http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - es ist * nicht zu empfehlen *, dies überall zu verwenden - ganz und gar Gegenteil! –

+0

Also ist das (NOLOCK) das Problem mit den Duplikaten? –

Antwort

1

Ihre Duplikate stammen wahrscheinlich aus der Abfrage und nicht aus vorhandenen Zeilen in der Tabelle. Möglicherweise ist das Problem, dass die select distinct nichts tut - weil newid() immer einzigartig ist.

Meine Empfehlung ist, die id Spalte zu ändern, um einen Standardwert von newid() zu haben. Dann müssen Sie es nicht einfügen und die select distinct wird funktionieren. Abwesend, dass Sie die Abfrage beheben:

INSERT INTO dbo.UserAccessRights (Id, UserId, RightType, RightsId, CreatedOn, CreatedBy) 
    SELECT DISTINCT NEWID(), @changedUserId, N'Process ' + @rightsTypeSuffix, 
      ProcessInstance_id, getdate(), @loggedInUserId 
    FROM (SELECT DISTINCT ptm.ProcessInstance_id 
      FROM dbo.ProcessTeamMembers ptm WITH (NOLOCK) INNER JOIN 
       dbo.Users u WITH (NOLOCK) 
       ON ptm.TeamMemberProfile_id = u.ProfileID AND 
        u.Id = @changedUserId AND 
       ptm.TenantId = @tenantId INNER JOIN 
       dbo.ProcessInstances p_i WITH (NOLOCK) 
       ON p_i.Id = ptm.ProcessInstance_id AND 
        p_i.DeletedOn IS NULL 
      WHERE NOT EXISTS (SELECT 1 
          FROM UserAccessRights uar WITH (NOLOCK) 
          WHERE uar.UserId = @changedUserId AND 
            uar.RightsId = ptm.ProcessInstance_id 
          ) 
    ) t; 

Hmmm, wie ich darüber nachdenken, vielleicht sollten Sie TOP 1 statt SELECT DISTINCT werden. Ich bin mir nicht sicher, welche Spalten das Problem auf dem distinct verursachen, aber Sie fügen denselben Wert in viele Spalten ein, sodass mehr als eine Zeile ein Problem verursachen kann.

+0

Wir müssten wahrscheinlich sein Schema und die Beispieldaten sehen, die das Problem erzeugen, um das Problem mit mehreren Zeilen besser zu diagnostizieren. –

+1

Danke Ihre Anfrage funktioniert. –

Verwandte Themen