编辑:只是让大家明白,我并不担心格式化,我担心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)
这对我来说更"可读"
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"中匹配行的行,我们可以对查询进行一些其他更改.这可能会使它更具"可读性".