如何提高选择效率

问题描述 投票:-2回答:1

我正在研究新代码,该代码应:作为程序的共同点进行报告:(因此,将其读为“ MAKE PROCEDURE WHICH display”:)

  1. Id
  2. 工作编号
  3. IMEI
  4. DataRejestracji(注册日期,以特殊格式-在表其diffrenet
  5. [Akcesoria(附件的全名,一个接一个地使用“,”从Jobs.Accessories并使用SPLIT功能
  6. Id_JobsArch((Jobs.ID = JobsArch.ID_Jobs,只有一个最新日期记录应显示)
  7. Naprawiony(如果pole Jobs.RepairDate为空,则为No,否则为No)
  8. FLSymptomCodes(JobsSpares.ID_JOBS = Jobs.ID>JobsSpares.ID_FLSymptomCodes = FLSymptomCodes.ID,一个接一个使用“;”
  9. NazwaHosta(主机名)

过程在开始ODDOIMEI时有3个输入参数当您免费(空)时,应显示100个最新的作业记录

对我来说一切都很好,但是我的主管希望我不要使用IF ELSE来优化它,他建议我使用WHERE作为更好的选择。

ALTER PROCEDURE raport @OD DATE,  @DO DATE, @IMEI nvarchar(200)
AS
BEGIN
IF ISNULL(@IMEI, '') <> '' AND ISNULL(@OD,'') <>'' AND ISNULL(@DO,'') <>''
BEGIN

SELECT  top 1 
        Z.ID,
        Z.JobNo,
        Z.IMEI, 
        CAST(Z.DateBooked AS DATE) AS DataRejestracji, 
        Akcesoria = STUFF(
                            (
                                SELECT ',' + A.Accessory
                                    FROM    dbo.SPLIT(Z.Accessories, '/') new
                                        INNER JOIN dbo.Accessories A ON new.items = A.Skrot COLLATE DATABASE_DEFAULT    



                                  FOR XML PATH (''), TYPE
                        ).value('.', 'varchar(max)'), 1, 1, ''
                    ) ,
    --JA.ID_Jobs, 
    JA.ID as ID_JobsArch,       
    FLSymptomsCodes = STUFF
                        (
                            (
                                SELECT ',' + FS.FLSymptomCode
                        FROM JobsSpares JS
                        INNER JOIN FLSymptomCodes FS ON JS.ID_FLSymptomCodes = FS.ID
                        WHERE js.id_jobs=Z.ID
                                FOR XML PATH (''), TYPE
                            ).value('.', 'varchar(max)')
                        , 1, 1, ''),
    @@servername    AS [Nazwa Hosta],
     CASE  WHEN  Z.RepairDate IS NULL THEN 'NIE'
                    ELSE 'TAK'
                    END AS Naprawiony

FROM ZTEPro.dbo.Jobs AS Z
INNER JOIN dbo.JobsArch JA
ON Z.ID=JA.ID_Jobs

WHERE   
        Z.IMEI = @IMEI AND 
        Z.DateBooked BETWEEN @OD AND @DO
ORDER BY Id_JobsArch DESC
END
ELSE
BEGIN
SELECT  top 100 
        Z.ID,
        Z.JobNo,
        Z.IMEI, 
        CAST(Z.DateBooked AS DATE) AS DataRejestracji, 
        Akcesoria = STUFF(
                            (
                                SELECT ',' + A.Accessory
                                    FROM    dbo.SPLIT(Z.Accessories, '/') new
                                        INNER JOIN dbo.Accessories A ON new.items = A.Skrot COLLATE DATABASE_DEFAULT    



                                  FOR XML PATH (''), TYPE
                        ).value('.', 'varchar(max)'), 1, 1, ''
                    ) ,
    --JA.ID_Jobs, 
    JA.ID as ID_JobsArch,
    JA.ActData,         
    FLSymptomsCodes = STUFF
                        (
                            (
                                SELECT ',' + FS.FLSymptomCode
                        FROM JobsSpares JS
                        INNER JOIN FLSymptomCodes FS ON JS.ID_FLSymptomCodes = FS.ID
                        WHERE js.id_jobs=Z.ID
                                FOR XML PATH (''), TYPE
                            ).value('.', 'varchar(max)')
                        , 1, 1, ''),
    @@servername    AS [Nazwa Hosta],
     CASE  WHEN  Z.RepairDate IS NULL THEN 'NIE'
                    ELSE 'TAK'
                    END AS Naprawiony

FROM ZTEPro.dbo.Jobs AS Z
INNER JOIN dbo.JobsArch JA
ON Z.ID=JA.ID_Jobs


ORDER BY JA.ActData DESC
END


END;

也许WHERE子句...但是我没主意。也不知道我应该在这里再说些什么细节。

sql sql-server tsql query-performance
1个回答
0
投票

您可以实现这样的条件TOP子句(无需使用ISNULL函数:]

© www.soinside.com 2019 - 2024. All rights reserved.