“Где В” с несколькими столбцами (SQL Server)

У меня был следующий уникальный индекс в таблице TaskTimeEntriesCaching, который вызывал сбой аварийного восстановления.

    /****** Object:  Index [UC_TaskTimeEntriesCaching_TaskID]    Script Date: 17-01-2019 12:21:57 ******/
    ALTER TABLE [dbo].[TaskTimeEntriesCaching] ADD  CONSTRAINT [UC_TaskTimeEntriesCaching_TaskID] UNIQUE NONCLUSTERED 
    (
        [TaskID] ASC,
        [DeletedFlag] ASC,
        [sid] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
    GO

Также у меня была служба Windows SymmetricDS в остановленном состоянии в течение пары дней, и у меня был канал «материи», параллельный каналу по умолчанию. Поэтому мне пришлось отбросить этот уникальный индекс, чтобы завершить канал перезагрузки.

С уважением

Раджат Агравал

12
задан bluish 2 May 2011 в 13:28
поделиться

4 ответа

Необходимо отделиться в двух пунктах

 where col1 in (...) AND col2 in (...)

или Вы могли осуществить рефакторинг его немного

select * FROM (
     SELECT NEWID() AS guid, UserID, RoleId, ClubId, 0 AS GroupRole FROM dbo.Portal_UserRoles 
     UNION 
     SELECT NEWID() AS guid, dbo.Portal_UserGroups.UserId, dbo.Portal_GroupRoles.RoleId, dbo.Portal_UserGroups.ClubId, dbo.Portal_GroupRoles.GroupId AS GroupRoles FROM dbo.Portal_GroupRoles INNER JOIN dbo.Portal_UserGroups ON dbo.Portal_GroupRoles.GroupId = dbo.Portal_UserGroups.GroupId) 
     AS derivedtbl_1, Portal_GroupRoles, Portal_ClubGroup
where derivedtbl_1.RoleId = Portal_GroupRoles.RoleId
and derivedtbl_1.ClubId = Portal_ClubGroups.ClubId
and Portal_GroupRoles.GroupId = Portal_ClubGroups.GroupId
-3
ответ дан 2 December 2019 в 18:22
поделиться

Сделайте соединение на полученной таблице вместо того, чтобы использовать in

SELECT * 
FROM  
  (
    SELECT NEWID() AS guid, UserID, RoleId, ClubId, 0 AS GroupRole 
    FROM dbo.Portal_UserRoles 

    UNION 

    SELECT NEWID() AS guid, dbo.Portal_UserGroups.UserId, 
           dbo.Portal_GroupRoles.RoleId, dbo.Portal_UserGroups.ClubId,
           dbo.Portal_GroupRoles.GroupId AS GroupRole 
    FROM dbo.Portal_GroupRoles 
    INNER JOIN dbo.Portal_UserGroups 
        ON dbo.Portal_GroupRoles.GroupId = dbo.Portal_UserGroups.GroupId
  ) AS derivedtbl_1 

INNER JOIN 
  (
    SELECT Portal_GroupRoles.RoleId, Portal_ClubGroups.ClubId 
    FROM Portal_GroupRoles 
    INNER JOIN Portal_ClubGroups 
        ON Portal_GroupRoles.GroupId = Portal_ClubGroups.GroupId
  ) derivedtbl_2
    ON derivedtbl_1.RoleID = derivedtbl_2.RoleID 
      AND derivedtbl_1.ClubId = derivedtbl_2.ClubId
5
ответ дан 2 December 2019 в 18:22
поделиться

Стандарт, классический способ сделать, что Вы ищете, СУЩЕСТВУЕТ пункт:

SELECT * 
    FROM         
    (
        SELECT NEWID() AS guid, UserID, RoleId, ClubId, 0 AS GroupRole
        FROM dbo.Portal_UserRoles

        UNION

        SELECT NEWID() AS guid, dbo.Portal_UserGroups.UserId, 
               dbo.Portal_GroupRoles.RoleId, dbo.Portal_UserGroups.ClubId, 
               dbo.Portal_GroupRoles.GroupId AS GroupRole
            FROM dbo.Portal_GroupRoles 
                 INNER JOIN dbo.Portal_UserGroups 
                 ON dbo.Portal_GroupRoles.GroupId = dbo.Portal_UserGroups.GroupId
    ) AS derivedtbl_1
WHERE EXISTS
  (
     SELECT Portal_GroupRoles.RoleId, Portal_ClubGroups.ClubId
         FROM (Portal_GroupRoles 
               INNER JOIN Portal_ClubGroups
               ON Portal_GroupRoles.GroupId = Portal_ClubGroups.GroupId) AS cgr
         WHERE derivedtbl_1.RoleID = cgr.RoleId
           AND derivedtbl_1.ClubId = cgr.ClubId
  )

Опасайтесь разделять условие на два столбца на два отдельных В пунктах; это не дает Вам тот же ответ (в целом) как применение условия на два столбца в, каждый СУЩЕСТВУЕТ пункт.

13
ответ дан 2 December 2019 в 18:22
поделиться
SELECT 
    /*      
    your selected fields, joins here
    */
WHERE -- (derivedtbl_1.RoleId,derivedtbl_1.ClubId) IN 
    EXISTS
    (
        -- actually you can change these two fields to * (asterisk ) or 1, whatever, even your name, what matters only is the testing of existence(see below)
        SELECT Portal_GroupRoles.RoleId, Portal_ClubGroups.ClubId 
        FROM Portal_GroupRoles 
        INNER JOIN Portal_ClubGroups
        ON Portal_GroupRoles.GroupId = Portal_ClubGroups.GroupId

        -- here is your IN (the testing of existence):
        WHERE Portal_GroupRoles.RoleId = derivedtbl_1.RoleId AND 
        AND derivedtbl_1.ClubId = derivedtbl_1.ClubId
      )

alternatively:

SELECT 
    /*      
    your selected fields, joins here
    */
JOIN 
    (
        SELECT Portal_GroupRoles.RoleId, Portal_ClubGroups.ClubId
        FROM Portal_GroupRoles 
        INNER JOIN Portal_ClubGroups
        ON Portal_GroupRoles.GroupId = Portal_ClubGroups.GroupId
    ) X 
    -- here is your IN:
    ON X.RoleId = derivedtbl_1.RoleId
    AND X.ClubId = derivedtbl_1.ClubId
3
ответ дан 2 December 2019 в 18:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: