了解SQL查询

May*_*May 1 sql t-sql sql-server greatest-n-per-group

我是SQL的新手,我一直绞尽脑汁想要确切地知道我在工作中收到的查询到底是什么.我相信它正在使用别名,但我不确定为什么,因为它只有一个表所指的.我认为这是一个相当简单的我只是没有得到它.

select [CUSTOMERS].Prefix,
[CUSTOMERS].NAME,
[CUSTOMERS].Address,
[CUSTOMERS].[START_DATE],
[CUSTOMERS].[END_DATE]  from [my_Company].[CUSTOMERS]  
where [CUSTOMERS].[START_DATE] =
   (select max(a.[START_DATE])
   from [my_company].[CUSTOMERS] a
where a.Prefix = [CUSTOMERS].Prefix
 and a.Address = [CUSTOMERS].ADDRESS
 and coalesce(a.Name, 'Go-Figure') =
     coalesce([CUSTOMERS].a.Name, 'Go-Figure'))
Run Code Online (Sandbox Code Playgroud)

jos*_*shp 5

这是英文版的一个镜头......

看起来目的是获取客户名称,地址,开始日期的列表.

但是该表预计包含多个具有相同客户名称和地址的行,并且作者只希望具有最新开始日期的行.

好点:

  • 如果客户具有与另一个客户相同的名称和地址以及前缀,则会显示具有最新开始日期的客户.
  • 如果缺少客户,则使用名称"Go Figure".因此,缺少名称的两行将匹配,并且将返回具有最近开始日期的行.缺少名称的行与具有名称的另一行不匹配.这两行都将被返回.

  • 任何没有开始日期的行都将从结果中排除.

这看起来不像来自真实业务应用程序的查询.也许它只是一个概念原型.在大多数现实世界中,它充满了问题.匹配名称和地址与简单的相等只是在现实世界中不能很好地工作,除非名称和地址已被其他进程清理和重复删除.

关于别名的使用:是的.子查询使用a作为my_Company.CUSTOMERS表的别名.

我相信最后一行有错误.

[CUSTOMERS].a.Name
Run Code Online (Sandbox Code Playgroud)

不是有效的参考.它可能意味着

[CUSTOMERS].Name
Run Code Online (Sandbox Code Playgroud)