SQL Server 2008 R2:仅显示最近添加的记录

时间:2015-12-09 05:40:19

标签: sql sql-server sql-server-2008-r2

我有两张桌子:

  1. 客户:包含客户详细信息,如客户ID和客户名称。

  2. Cust_Address:此表包含客户ID和客户地址。

  3. Cust

    create table cust
    (
      cust_id int,
      cust_name varchar(10)
    );
    

    记录插入

    insert into cust values(1,'A');
    insert into cust values(2,'B');
    insert into cust values(3,'C');
    insert into cust values(4,'D');
    

    Cust_Address

    create table cust_address
    (
      cust_id int,
      cust_add varchar(50)
    );
    

    记录插入

    insert into cust_address values(1,'US');
    insert into cust_address values(2,'UK');
    insert into cust_address values(3,'UAE');
    insert into cust_address values(4,'SA');
    insert into cust_address values(1,'AUS');
    insert into cust_address values(2,'IND');
    insert into cust_address values(3,'SL');
    insert into cust_address values(1,'CHINA');
    

    现在我想显示包含表Cust_Address中插入的最新客户地址的结果。

    预期结果

    Cust_ID    Cust_Name   Cust_Add
    -------------------------------
    1          A           CHINA
    2          B           IND
    3          C           SL
    4          D           SA
    

    以下是表格及其记录的SQLFiddle

2 个答案:

答案 0 :(得分:2)

您无法以任何特定顺序检索行。您需要更多信息才能获得订单。 最好的方法是Cust_address

中的主索引
CustAddrID int identity(1, 1) not null primary key

您还可以拥有 CreatedOn 列,其默认值等于 getDate()

之后,您可以确定每个 Cust 记录的 CustAddr 的最后插入值是什么。

如果您无法在那里添加新列,那么可能 change tracking功能。但是你的问题似乎太过微不足道了。

SQL Server 2016中也有Temporal Tables。但同样可能太多了。

以下是使用主键 CustAddrID 获取地址的示例 SQL Fiddle

select  cust_name, cust_add
from cust C 
join 
(select 
  cust_add, cust_id,
  row_number() over (partition by cust_id  order by cust_add_id desc) rn
  from cust_address ) CLA
 on CLA.cust_id = C.cust_id and
    CLA.rn = 1

每次向表中插入新值时,标识列都会增加。您的案例的正确值将是具有最高cust_add_id和指定cust_id的记录。

在上面的查询中,我们使用 row_number()函数为每个 cust_id (按cust_id分区)从1开始以desc顺序生成数字。最后,我们只采用生成数字 rn 等于1 CLA.rn = 1 的记录,然后将其加入 cust 表。

您可以用max(cust_add_id)替换row_number(),用cust_id替换group。但是,在这种情况下,您需要两次加入cust_add表。

答案 1 :(得分:1)

您将无法按照插入顺序从链接表中获取行。

你需要有一个专栏。

想象一下,如果您需要为每条创建记录保留记录,那么元数据会有多大!您是否还希望在元数据上保留元数据,以便了解元数据何时更新?空间使用可以迅速升级。

SQL Server会保留一些统计信息,但这些特定信息需要来自用户定义的字段。

因此,您要么使用CustAddr表中的标识列[CustAddr int identity(1,1)not null primary key],要么为createdDateAndTime DateTime Default GetDate()添加一列。