了解 SQL 查询

Understanding an SQL Query

我是 SQL 的新手,我一直在绞尽脑汁试图弄清楚我在工作中收到的要修改的查询到底在说明什么。我相信它使用的是别名,但我不确定为什么,因为它只引用了一个 table 。我认为这是一个相当简单的我只是不明白。

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'))

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

看起来目的是获取客户姓名、地址、开始日期的列表。

但是 table 预计会包含多个具有相同客户名称和地址的行,而作者只想要具有最近开始日期的行。

好点数:

  • 如果一位客户与另一位客户具有相同的名称、地址和前缀,则会显示开始日期最近的客户。
  • 如果缺少客户,则使用姓名 'Go Figure'。因此,缺少名称的两行将匹配,并且将返回开始日期最近的那一行。缺少名称的行将不会匹配具有名称的另一行。将返回两行。

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

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

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

的别名

我认为最后一行有一个错误

[CUSTOMERS].a.Name

不是有效参考。本来应该是

[CUSTOMERS].Name

我假设,它从最近的 [CUSTOMERS].[START_DATE]

table [CUSTOMERS] 中选择有关客户记录的记录

@Joshp 给出了一个很好的答案,尽管我在各种实际应用程序中看到过这类查询,甚至更糟。

看看下面的查询是否给您相同的结果。这些查询通常不会等效,但我怀疑它们与您获得的数据相同。我相信我所做的唯一假设是开始日期和结束日期之间的范围从不相交或重叠,这意味着最大开始和最大结束总是在同一行中。

select
    c.Prefix, c.NAME, c.Address,
    max(c.START_DATE) as Start_Date,
    max(c.END_DATE) as End_Date
from my_Company.CUSTOMERS as c
group by c.Prefix, c.NAME, c.Address

您会注意到别名是一个很好的 shorthand,可以使查询保持可读性。当然,当只有一个 table 时,它们根本不是必需的。