我有两张桌子:
客户:包含客户详细信息,如客户ID和客户名称。
Cust_Address:此表包含客户ID和客户地址。
表: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。
答案 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()添加一列。