通过多次调用同一张表来优化查询

时间:2020-10-13 17:13:47

标签: sql-server tsql

我们正在创建如下视图:

create view [dca].[CodeDescriptions_VW]
as 
    select distinct 
        ek.EmpKey
        , RTRIM(CONVERT(varchar(60), abt.fdesc)) AS AboriginalTypeDescription
        , RTRIM(CONVERT(varchar(60), cma.fdesc)) AS CensusMetroAreaDescription
        , RTRIM(CONVERT(varchar(60), q.c_desc)) AS CobraCodeDescription
        , RTRIM(CONVERT(varchar(60), ct.fdesc)) AS ConsentTypeDescription
        , RTRIM(CONVERT(varchar(60), li.fdesc)) AS DirectOrIndirectDescription
        , RTRIM(CONVERT(varchar(60), dt.fdesc)) AS DisabilityTypeDescription
        , RTRIM(CONVERT(varchar(60), doca.fdesc)) AS DocumentADescription
    FROM  
        dbo.hrpersnl AS h 
    INNER JOIN 
        HRActions.dbo.EmployeeKey AS ek ON RTRIM(LTRIM(UPPER(h.p_empno))) = UPPER(ek.EmpNo) COLLATE SQL_Latin1_General_CP1_CI_AS 
                                        AND h.p_company = ek.Company COLLATE SQL_Latin1_General_CP1_CI_AS 
    LEFT OUTER JOIN 
        dbo.hrtables AS abt ON abt.ftable = ''AL'' AND RTRIM(h.p_abotype) = RTRIM(abt.code)
    LEFT OUTER JOIN 
        dbo.hrtables AS cma ON cma.ftable = ''CM'' AND RTRIM(h.p_cma) = RTRIM(cma.code) 
    LEFT OUTER JOIN 
        dbo.hrtables AS ct ON ct.ftable = ''CS'' AND RTRIM(h.p_constype) = RTRIM(ct.code)
    LEFT OUTER JOIN 
        dbo.hrtables AS li ON li.ftable = ''IN'' AND RTRIM(h.p_laborind) = RTRIM(li.code)
    LEFT OUTER JOIN 
        dbo.hrtables AS dt ON dt.ftable = ''DI'' AND RTRIM(h.p_distype) = RTRIM(dt.code)
    LEFT OUTER JOIN 
        dbo.hrtables AS doca ON doca.ftable = ''I2'' AND RTRIM(h.p_doca) = RTRIM(doca.code)

我想知道是否有一种更有效的方法可以多次引用同一张表(dbo.hratables)。就目前而言,这是一个非常昂贵的视图(实际上,我们需要查询大约3打不同的“描述”,我只显示了其中的几个)。

1 个答案:

答案 0 :(得分:0)

虽然不理想,但是您可以创建一个内联TVF并将其与所有联接一起使用。

类似的东西:

CREATE FUNCTION dbo.HRDescription ( 
    @ftable VARCHAR(2), @code VARCHAR(50), @field VARCHAR(50)
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT RTRIM( CONVERT( VARCHAR(60), 
        CASE
            WHEN @field = 'c_desc' THEN c_desc
            ELSE fdesc
        END ) ) AS [Value]
    FROM dbo.hrtables
    WHERE
        ftable = @ftable AND RTRIM( code ) = @code
)
GO

然后修改您的查询:

SELECT DISTINCT 
    ek.EmpKey
    , ( SELECT [Value] FROM dbo.HRDescription( 'AL', h.p_abotype, 'fdesc' ) ) AS AboriginalTypeDescription
    , ( SELECT [Value] FROM dbo.HRDescription( 'CM', h.p_cma, 'fdesc' ) ) AS CensusMetroAreaDescription
    , ( SELECT [Value] FROM dbo.HRDescription( 'CS', h.p_constype, 'fdesc' ) ) AS ConsentTypeDescription
    , ( SELECT [Value] FROM dbo.HRDescription( 'IN', h.p_laborind, 'fdesc' ) ) AS DirectOrIndirectDescription
    , ( SELECT [Value] FROM dbo.HRDescription( 'DI', h.p_distype, 'fdesc' ) ) AS DisabilityTypeDescription
    , ( SELECT [Value] FROM dbo.HRDescription( 'I2', h.p_doca, 'fdesc' ) ) AS DocumentADescription
FROM dbo.hrpersnl AS h 
INNER JOIN HRActions.dbo.EmployeeKey AS ek 
    ON RTRIM(LTRIM(UPPER(h.p_empno))) = UPPER(ek.EmpNo) COLLATE SQL_Latin1_General_CP1_CI_AS 
    AND h.p_company = ek.Company COLLATE SQL_Latin1_General_CP1_CI_AS;

同样,这不是理想的选择,但它可能会节省联接的性能。