Как сделать этот выбор более эффективным - PullRequest
0 голосов
/ 09 марта 2020

Я работаю над своим новым кодом, который должен: Сделать отчет как процедуру, содержащую полюс: (поэтому прочитайте его как СДЕЛАТЬ ПРОЦЕДУРУ, КОТОРЫЙ отображает:)

  1. Id
  2. JobNo
  3. IMEI
  4. DataRejestracji (дата регистрации fe) в формате specyfi c - в таблице его diffr enet
  5. Akcesoria (полные имена аксессуаров, использующих один за другим используя "," из Jobs.Accessories и используйте функцию SPLIT
  6. Id_JobsArch ((Jobs.ID = JobsArch.ID_Jobs и должна отображаться только одна новейшая запись даты)
  7. Направионы (если полюс Джобса. RepairDate пуст, тогда Нет, если еще ДА)
  8. FLSymptomCodes (JobsSpares.ID_JOBS = Jobs.ID> JobsSpares.ID_FLSymptomCodes = FLSymptomCodes.ID, один за другим, используя ";"
  9. NazwaHosta (имя хоста)

Процедура имеет 3 входных параметра при запуске OD, DO, IMEI КОГДА ВЫ ПОЛУЧАЕТЕ ИХ БЕСПЛАТНО (пусто), должно отображаться 100 новейших записей задания

Сделано у меня все работает нормально, однако мой руководитель хочет, чтобы я Измените его, не используя IF ELSE, и он предлагает мне использовать ГДЕ как лучший вариант.

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 предложения ... но у меня нет идей. Также не знаю, какие подробности мне следует здесь разместить.

1 Ответ

0 голосов
/ 09 марта 2020

Вы можете получить условное условие TOP, подобное этому (нет необходимости использовать функцию ISNULL):

SELECT TOP (SELECT case when @IMEI is not null AND @OD is not null AND @DO is not null then 1 else 100 end)

Вы также можете настроить выражение WHERE, чтобы оно применялось только тогда, когда все ваши переменные не равны NULL:

WHERE   (@IMEI is null or @OD is null or @DO is null) or
        (Z.IMEI = @IMEI AND 
        Z.DateBooked BETWEEN @OD AND @DO)

Ваш запрос будет выглядеть следующим образом:

SELECT  top (select case when @IMEI is not null AND @OD is not null AND @DO is not null then 1 else 100 end) 
        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
WHERE   (@IMEI is null or @OD is null or @DO is null) or
        (Z.IMEI = @IMEI AND 
        Z.DateBooked BETWEEN @OD AND @DO)
ORDER BY Id_JobsArch DESC

Вероятно, он не будет работать заметно быстрее, чем ваш исходный запрос, но, по крайней мере, он будет более компактным.

...