Sql server 其他的子查询集,但这会变得非常混乱和可笑的冗长吗

Sql server 其他的子查询集,但这会变得非常混乱和可笑的冗长吗,sql-server,Sql Server,还有比这更好的方法吗 试试看 LI>出于性能原因,我将考虑使用表变量或临时表来避免同一表的多个查询。此外,表变量和临时表至少可以有一个主键,而公共表表达式不编制索引 例如: DECLARE @GroupName VARCHAR(100) SELECT @GroupName = g.GroupName FROM dbo.Groups g WHERE g.GroupId = @GroupId DECLARE @Users TABLE ( UserId INT NOT NULL PR

还有比这更好的方法吗

  • 试试看
  • <> LI>出于性能原因,我将考虑使用表变量或临时表来避免同一表的多个查询。此外,表变量和临时表至少可以有一个主键,而公共表表达式不编制索引 例如:

    DECLARE @GroupName VARCHAR(100)
    SELECT @GroupName = g.GroupName
    FROM   dbo.Groups g
    WHERE  g.GroupId = @GroupId
    
    DECLARE @Users TABLE
    (
        UserId INT NOT NULL PRIMARY KEY,
        Consultant VARCHAR(100) NOT NULL
    )
    
    INSERT @Users (UserId, Consultant)
    SELECT u.UserId, u.UserName + ' ' + u.Surname
    FROM   dbo.Users u
    INNER JOIN dbo.UserGroups ug ON u.UserId = ug.UserId AND ug.GroupId = @GroupId
    WHERE  u.Inactive = 'N'
    AND    NOT EXISTS (SELECT 1 FROM dbo.UserGroups ne
                       WHERE  u.UserId = ne.UserId
                       AND    ne.GroupId = 57)
    
    DECLARE @ClientContacts TABLE
    (
        UserId INT NOT NULL PRIMARY KEY,
        ManagerCount INT NOT NULL
    )
    
    INSERT @ClientContacts (UserId, ManagerCount)
    SELECT u.UserId, COUNT(*)
    FROM   @Users u
    INNER JOIN dbo.ClientContacts cc ON cc.CreatedUserId = u.UserId AND cc.CreatedOn BETWEEN @startDate AND @endDate
    GROUP BY u.UserId
    
    DECLARE @Interviews TABLE
    (
        UserId INT NOT NULL,
        InterviewTypeId INT NOT NULL,
        InterviewCount INT NOT NULL,
        PRIMARY KEY (UserId, InterviewTypeId)
    )
    
    INSERT @Interviews (UserId, InterviewTypeId, InterviewCount)
    SELECT u.UserId, i.InterviewTypeId, COUNT(*)
    FROM   @Users u
    INNER JOIN dbo.Interviews i ON u.UserId = i.CreatedUserId AND i.InterviewTypeId BETWEEN 1 AND 4 AND i.CreatedOn BETWEEN @StartDate AND @EndDate
    GROUP BY u.UserId, i.InterviewTypeId
    
    -- Rest is an exercise for the reader, but:
    
    SELECT @GroupName AS GroupName,
           @GroupId AS GroupId,
           CASE GROUPING(u.UserId) WHEN 1 THEN NULL ELSE MIN(u.Consultant) END AS Consultant,
           u.UserId,
           SUM(COALESCE(cc.ManagerCount, 0)) AS ManagersAdded,
           SUM(COALESCE(ip.[1], 0)) AS FirstInterviewCount,
           SUM(COALESCE(ip.[1], 0) + COALESCE(ip.[3], 0) + COALESCE(ip.[4], 0)) AS InterviewCount,
           SUM(COALESCE(ip.[2], 0)) AS TelephoneCount
    FROM   @Users u
    LEFT JOIN @ClientContacts cc ON u.UserId = cc.UserId
    LEFT JOIN (SELECT i.UserId, i.InterviewTypeId, i.InterviewCount
               FROM   @Interviews i) AS ii
              PIVOT (SUM(InterviewCount) FOR InterviewTypeId IN ([1], [2], [3], [4])) AS ip ON u.UserId = ip.UserId
    GROUP BY ROLLUP(u.UserId)
    ORDER BY GROUPING(u.UserId), u.UserId
    

    您是否尝试过使用公共表表达式?是相同的文档。@rusk使用CTE和表变量有什么区别?也许能帮你弄清楚。“甜美的FA知识”从我这里得到一个加分。我支持cte方法,因为它是值得的。将当前选择包装在cte中,然后执行“从cte union all select中选择*”。
    DECLARE @GroupName VARCHAR(100)
    SELECT @GroupName = g.GroupName
    FROM   dbo.Groups g
    WHERE  g.GroupId = @GroupId
    
    DECLARE @Users TABLE
    (
        UserId INT NOT NULL PRIMARY KEY,
        Consultant VARCHAR(100) NOT NULL
    )
    
    INSERT @Users (UserId, Consultant)
    SELECT u.UserId, u.UserName + ' ' + u.Surname
    FROM   dbo.Users u
    INNER JOIN dbo.UserGroups ug ON u.UserId = ug.UserId AND ug.GroupId = @GroupId
    WHERE  u.Inactive = 'N'
    AND    NOT EXISTS (SELECT 1 FROM dbo.UserGroups ne
                       WHERE  u.UserId = ne.UserId
                       AND    ne.GroupId = 57)
    
    DECLARE @ClientContacts TABLE
    (
        UserId INT NOT NULL PRIMARY KEY,
        ManagerCount INT NOT NULL
    )
    
    INSERT @ClientContacts (UserId, ManagerCount)
    SELECT u.UserId, COUNT(*)
    FROM   @Users u
    INNER JOIN dbo.ClientContacts cc ON cc.CreatedUserId = u.UserId AND cc.CreatedOn BETWEEN @startDate AND @endDate
    GROUP BY u.UserId
    
    DECLARE @Interviews TABLE
    (
        UserId INT NOT NULL,
        InterviewTypeId INT NOT NULL,
        InterviewCount INT NOT NULL,
        PRIMARY KEY (UserId, InterviewTypeId)
    )
    
    INSERT @Interviews (UserId, InterviewTypeId, InterviewCount)
    SELECT u.UserId, i.InterviewTypeId, COUNT(*)
    FROM   @Users u
    INNER JOIN dbo.Interviews i ON u.UserId = i.CreatedUserId AND i.InterviewTypeId BETWEEN 1 AND 4 AND i.CreatedOn BETWEEN @StartDate AND @EndDate
    GROUP BY u.UserId, i.InterviewTypeId
    
    -- Rest is an exercise for the reader, but:
    
    SELECT @GroupName AS GroupName,
           @GroupId AS GroupId,
           CASE GROUPING(u.UserId) WHEN 1 THEN NULL ELSE MIN(u.Consultant) END AS Consultant,
           u.UserId,
           SUM(COALESCE(cc.ManagerCount, 0)) AS ManagersAdded,
           SUM(COALESCE(ip.[1], 0)) AS FirstInterviewCount,
           SUM(COALESCE(ip.[1], 0) + COALESCE(ip.[3], 0) + COALESCE(ip.[4], 0)) AS InterviewCount,
           SUM(COALESCE(ip.[2], 0)) AS TelephoneCount
    FROM   @Users u
    LEFT JOIN @ClientContacts cc ON u.UserId = cc.UserId
    LEFT JOIN (SELECT i.UserId, i.InterviewTypeId, i.InterviewCount
               FROM   @Interviews i) AS ii
              PIVOT (SUM(InterviewCount) FOR InterviewTypeId IN ([1], [2], [3], [4])) AS ip ON u.UserId = ip.UserId
    GROUP BY ROLLUP(u.UserId)
    ORDER BY GROUPING(u.UserId), u.UserId