T-SQL:丑陋的SQL

Bla*_*ite 0 t-sql sql-server

编辑:只是让大家明白,我并不担心格式化,我担心GROUP By的使用以及聚合字段的使用,因为它没有多大意义.

我的任务是让一些SQL更具可读性.虽然我一般都知道该怎么做,但这个特殊的查询让我感到厌烦.查询的要点涉及作者按一大堆字段进行分组,并将这些字段添加到查询结果中.对于他/她不是GROUP BY的字段,他们使用MIN聚合函数我想"让错误消失"

MIN(ISNULL(dbo.V_CONNECT_ContactPartnerDetail_0010.SAPNr, N'')) AS sapkunr, 
Run Code Online (Sandbox Code Playgroud)

我的困难来自于我可以将GROUP BY填充到CTE中,然后从那里分支出来,但我从来没有得到行计数来匹配我创建的查询和原始查询.任何帮助使这个SQL更具可读性并使其意图更清晰(没有使错误消失的功能)将不胜感激.

SELECT dbo.V_CONNECT_ContactPartnerDetail_0010.ID_FI                    AS firmencode,
       dbo.V_CONNECT_ContactPartnerDetail_0010.ID_KP                    AS partnercode,
       dbo.V_CONNECT_ContactPartnerDetail_0010.Nachname,
       Min(Isnull(dbo.V_CONNECT_ContactPartnerDetail_0010.Vorname, '')) AS vname,
       Min(CASE V_CONNECT_ContactPartnerDetail_0010.Anrede
             WHEN 'Frau' THEN 2
             ELSE 1
           END)                                                         AS anrede,
       Min(Isnull(dbo.V_CONNECT_ContactPartnerDetail_0010.EMail, N''))  AS mail,
       Min(Isnull(dbo.V_CONNECT_ContactPartnerDetail_0010.SAPNr, N''))  AS sapkunr,
       Isnull(dbo.V_CONNECT_ContactPartnerDetail_0010.Titel, N'')       AS titel
FROM   dbo.V_CONNECT_ContactPartnerDetail_0010
       INNER JOIN dbo.V_CONNECT_ContactPartnerPivot
               ON dbo.V_CONNECT_ContactPartnerDetail_0010.ID_C005 = dbo.V_CONNECT_ContactPartnerPivot.ID_C005
       LEFT OUTER JOIN dbo.V_CONNECT_Firmen_PZ_Download
                    ON dbo.V_CONNECT_ContactPartnerDetail_0010.ID_VF = dbo.V_CONNECT_Firmen_PZ_Download.ID_VF
WHERE  ( dbo.V_CONNECT_ContactPartnerDetail_0010.VKO = '0010' )
GROUP  BY dbo.V_CONNECT_ContactPartnerDetail_0010.ID_FI,
          dbo.V_CONNECT_ContactPartnerDetail_0010.ID_KP,
          dbo.V_CONNECT_ContactPartnerDetail_0010.Nachname,
          dbo.V_CONNECT_ContactPartnerDetail_0010.Ort,
          dbo.V_CONNECT_ContactPartnerPivot.flg_spl,
          dbo.V_CONNECT_ContactPartnerPivot.flg_ha,
          dbo.V_CONNECT_ContactPartnerPivot.flg_fu,
          dbo.V_CONNECT_ContactPartnerPivot.flg_ma,
          dbo.V_CONNECT_ContactPartnerPivot.flg_ph,
          Isnull(dbo.V_CONNECT_ContactPartnerDetail_0010.Titel, N'') 
Run Code Online (Sandbox Code Playgroud)

spe*_*593 5

这对我来说更"可读"

 SELECT cpd.ID_FI                                          AS firmencode
      , cpd.ID_KP                                          AS partnercode
      , cpd.Nachname                                       AS Nachname
      , MIN(ISNULL( cpd.Vorname  ,''))                     AS vname
      , MIN(CASE cpd.Anrede WHEN 'Frau' THEN 2 ELSE 1 END) AS anrede
      , MIN(ISNULL( cpd.EMail    ,N''))                    AS mail
      , MIN(ISNULL( cpd.SAPNr    ,N''))                    AS sapkunr
      , ISNULL( cpd.Titel        ,N'')                     AS titel
   FROM dbo.V_CONNECT_ContactPartnerDetail_0010  cpd 
   JOIN dbo.V_CONNECT_ContactPartnerPivot  cpp 
     ON cpd.ID_C005 = cpp.ID_C005
   LEFT
   JOIN dbo.V_CONNECT_Firmen_PZ_Download  fpd
     ON fpd.ID_VF = cpd.ID_VF
  WHERE cpd.VKO = '0010'
  GROUP
     BY cpd.ID_FI
      , cpd.ID_KP
      , cpd.Nachname
      , cpd.Ort
      , cpp.flg_spl
      , cpp.flg_ha
      , cpp.flg_fu
      , cpp.flg_ma
      , cpp.flg_ph
      , ISNULL(cpd.Titel ,N'')
Run Code Online (Sandbox Code Playgroud)

编辑

如果我"负责使一些SQL更具可读性",我将从上面的更改开始.

除此之外,还不清楚为什么GROUP BY子句包含不在SELECT列表中的表达式.这样做是有效的.但令人好奇的是,如果"cpd"中有多行具有不同的"Ort"值,那么返回多行时会有一个重要的行,具有相同的"ID_FI","ID_KP","Nachname"值.

真正突出的是外连接到"fpd",除了在连接条件中对"ID_VF"列的引用之外,在查询中的任何其他地方都没有对"fpd"中的列的引用.看起来如果删除了外连接,我们会得到相同的结果.

我建议的第一个结构变化是将连接删除到"fpd".

 SELECT cpd.ID_FI                                          AS firmencode
      , cpd.ID_KP                                          AS partnercode
      , cpd.Nachname                                       AS Nachname
      , MIN(ISNULL( cpd.Vorname  ,''))                     AS vname
      , MIN(CASE cpd.Anrede WHEN 'Frau' THEN 2 ELSE 1 END) AS anrede
      , MIN(ISNULL( cpd.EMail    ,N''))                    AS mail
      , MIN(ISNULL( cpd.SAPNr    ,N''))                    AS sapkunr
      , ISNULL( cpd.Titel        ,N'')                     AS titel
   FROM dbo.V_CONNECT_ContactPartnerDetail_0010  cpd 
   JOIN dbo.V_CONNECT_ContactPartnerPivot        cpp 
     ON cpp.ID_C005 = cpd.ID_C005
  WHERE cpd.VKO = '0010'
  GROUP
     BY cpd.ID_FI
      , cpd.ID_KP
      , cpd.Nachname
      , cpd.Ort
      , ISNULL( cpd.Titel        ,N'')
      , cpp.flg_spl
      , cpp.flg_ha
      , cpp.flg_fu
      , cpp.flg_ma
      , cpp.flg_ph
Run Code Online (Sandbox Code Playgroud)

我们可以在GROUP BY子句中重新排列表达式,将"Title"与"cpd"中的其他列一起移动.如果没有ORDER BY子句,则无法保证返回行的顺序.

我们无法判断(来自查询和提供的信息)"ID_C005"列是"cpd"还是"cpp"中的PRIMARY KEY或UNIQUE KEY.

并且不知道这一点,我们无法在不改变结果的情况下对查询进行其他更改.如果"ID_C005"在"cpp"中是唯一的,那么我们可以从GROUP BY中消除所有"cpp"列引用.

如果内连接(到"cpp")的目的是过滤掉"cpd"中没有"cpp"中匹配行的行,我们可以对查询进行一些其他更改.这可能会使它更具"可读性".