我有 2 个表格 DraftProducts 和 Products。
两个表之间的唯一区别是“阶段”字段。
我的 DraftProducts 表中有 productCode varchar(20)、phase(tinyint)、Name、Price、SpecialCells.... 等字段。
对我来说,最后一个阶段实际上是 Product 表中的 1 条记录。
直到现在,当 1 位用户说草稿工作完成时,我自动在 Product 表中记录了最后一个阶段。
但是当最后的草稿发生变化时,它需要再次更新。删除时需要删除它等。很多额外的工作正在进行中。
在我的数据库中,一些表来自 DraftProducts 表,一些表来自 Products 表。
但是我可以将其作为独立于用户的“产品视图”来执行吗?
如何使用 max(phase) 1 记录创建“ProductsView”?我应该如何分组或区分?
由于这个表,我想要的 Products 表或视图应该是这样的。
p1=8 价格、类别、描述等 p2=15 价格、类别、描述等 p3=22 价格、类别、描述等
CREATE TABLE [dbo].[DraftProducts](
[productCode] [varchar](20) NULL,
[phase] [varchar](50) NULL,
[name] [varchar](50) NULL,
[category] [varchar](20) NULL,
[description] [varchar](20) NULL,
[price] float NULL
)
CREATE UNIQUE CLUSTERED INDEX [DraftProductsIndex1] ON [dbo].[DraftProducts]
(
[productCode] ASC,
[phase] ASC
)
insert into DraftProducts (productCode,phase,name)
values
('p1',1,'aaaaaaaaaaaaaaa'),
('p2',2,'aaaaaaaaaaaaaaa'),
('p3',1,'aaaaaaaaaaaaaaa'),
('p2',15,'bbbbbbbbbbbbbbb'),
('p3',22,'bbbbbbbbbbbbbbb'),
('p1',8,'bbbbbbbbbbbbbbbbbbbbbbbbb'),
('p2',7,'ccccccccccccccc')
7 rows affected
select * from DraftProducts
/*
finish phase
p1=8
p2=15
p3=22
*/
产品代码 | 阶段 | 姓名 | 类别 | 描述 | 价格 |
---|---|---|---|---|---|
p1 | 1 | 啊啊啊啊啊啊 | 无效的 | 无效的 | 无效的 |
p1 | 8 | bbbbbbbbbbbbbbbbbbbbbbbbbbb | 无效的 | 无效的 | 无效的 |
p2 | 15 | bbbbbbbbbbbbbbb | 无效的 | 无效的 | 无效的 |
p2 | 2 | 啊啊啊啊啊啊 | 无效的 | 无效的 | 无效的 |
p2 | 7 | cccccccccccccc | 无效的 | 无效的 | 无效的 |
p3 | 1 | 啊啊啊啊啊啊 | 无效的 | 无效的 | 无效的 |
p3 | 22 | bbbbbbbbbbbbbbb | 无效的 | 无效的 | 无效的 |
您正在寻找的是一个窗口函数,特别是一个排名窗口函数,例如
ROW_NUMBER()
:您所要做的就是在视图中拍打它,例如
ProductsView
,任何时候phase
特定productCode
视图的更改都会自动显示最新版本。窗口函数对于解决许多问题非常有帮助。我强烈建议阅读我提供的链接。其他窗口函数(如值函数)
FIRST_VALUE()
也LAST_VALUE()
可以用作解决问题的替代方法,但需要更多代码,我认为性能不如我上面提供的解决方案使用ROW_NUMBER()
.说到性能,虽然我怀疑您是否会遇到任何问题,但如果您想对聚集索引进行如下轻微更改,它会更适合我上面提供的解决方案:
请注意,我将其保留的顺序更改
phase
为DESC
(降序),因此它与上述解决方案中的函数ORDER BY
子句完全匹配。ROW_NUMBER()