SQL Server 2014
我正在尝试学习更好的 SQL 代码实践以提高性能。我正在继承一些旧代码,并想了解真正知道自己在做什么的人将如何改进它。
我试图将代码缩短为我现在正在处理的主要部分。似乎有比运行多个相关子查询更好的方法来获取原因代码(PersonalTraining、网球等)?但是,到目前为止,我无法让每个客户返回一行的结果。
第 3 方的最终结果必须保持不变。
客户可以有零到多个存储在表“asajoinmbr”中的原因代码
表asajoinmbr:
CREATE TABLE [dbo].[ASAJoinmbr](
[cust_code] [char](10) NOT NULL,
[mbr_code] [char](10) NOT NULL,
[reason_code] [char](3) NULL,
[associate_code] [char](10) NULL,
[join_note] [ntext] NULL,
[wants_contact] [char](1) NULL,
[club] [smallint] NULL,
[region] [char](4) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
表asambr:
CREATE TABLE [dbo].[ASAMembr](
[cust_code] [nvarchar](10) NULL,
[mbr_code] [nvarchar](10) NULL,
[lname] [nvarchar](20) NULL,
[fname] [nvarchar](20) NULL,
[status] [nvarchar](6) NULL,
[bdate] [datetime] NULL,
[email] [nvarchar](80) NULL,
[Club] [nvarchar](3) NULL,
) ON [PRIMARY]
表strcustr:
CREATE TABLE [dbo].[StrCustr](
[cust_code] [nvarchar](10) NULL,
[bridge_code] [nvarchar](10) NULL,
[bus_name] [nvarchar](30) NULL,
[status] [nvarchar](1) NULL,
[phone] [nvarchar](20) NULL,
[address1] [nvarchar](30) NULL,
[address2] [nvarchar](30) NULL,
[city] [nvarchar](20) NULL,
[state] [nvarchar](10) NULL,
[post_code] [nvarchar](10) NULL,
[cntry_abbrev] [nvarchar](3) NULL,
[cust_type] [nvarchar](10) NULL,
[obtained_date] [date] NULL,
[geo_code] [nvarchar](9) NULL,
[email] [nvarchar](80) NULL,
[club] [smallint] NULL,
) ON [PRIMARY]
GO
关于改进此代码的任何部分的任何想法?
select
SC.Club as [Location],
(LTRIM(RTRIM(SC.Cust_Code))+Mem.Mbr_code) as [Customer Number],
Replace(LTRIM(RTRIM(mem.fname)),'"','-') as [Customer First Name],
LTRIM(RTRIM(mem.lname)) as [Customer Last Name],
mem.email as [Customer Email Address],
(select 'Personal Training' from ASAJoinmbr ajm where sc.cust_code =
ajm.cust_code and reason_code = 'PT' group by cust_code) as PersonalTraining,
(select 'Group Fitness' from ASAJoinmbr ajm where sc.cust_code =
ajm.cust_code and (reason_code = 'GE' or reason_code = 'GF') group by
cust_code) as GroupFitness,
(select 'Cardio/Weight'from ASAJoinmbr ajm where sc.cust_code =
ajm.cust_code and (reason_code = 'CT' or reason_code = 'CV' or reason_code =
'WT') group by cust_code) as CardioWeight,
(select 'Tennis'from ASAJoinmbr ajm where sc.cust_code = ajm.cust_code and
(reason_code = 'TE' or reason_code = 'TN') group by cust_code) as Tennis,
(select 'Aquatics' from ASAJoinmbr ajm where sc.cust_code = ajm.cust_code
and reason_code = 'AQ' group by cust_code) as Aquatics
from strcustr SC
INNER JOIN ASAMEMBR MEM
on SC.cust_code=MEM.Cust_code
and sc.club=mem.Club
Where
DATEDIFF(year,(mem.bdate),GETDATE() ) >19
and (DATEDIFF(day, convert(date,sc.obtained_date,101),GETDATE() )= 14
or (DATEDIFF(day, convert(date,sc.obtained_date,101),GETDATE() )=93
and sc.status='A'))
and mem.status = 'A'
and mem.email is not null
and mem.email <>''
and (sc.bridge_code <> '94811' or sc.geo_code <> 'Goldsmbr')
and sc.cust_type<>'E'
group by
sc.club,sc.cust_code,mem.mbr_code,mem.fname,mem.lname,mem.email