【发布时间】:2013-01-29 07:53:11
【问题描述】:
我试图完全在 SQL(ANSI 或 TSQL,在 Sybase ASE 12 中)解决以下问题,而不依赖于游标或基于循环的逐行处理。
注意:我已经创建了一个在应用程序层实现相同目标的解决方案(因此请不要用“不要在 SQL 中执行此操作”来“回答”),但作为一个原则问题(希望提高性能)我想知道是否有一个有效的(例如无游标)纯 SQL 解决方案。
设置:
-
我有一个表 T,其中包含以下 3 列(全部不是 NULL):
---- Table T ----------------------------- | item | tag | value | | [int] | [varchar(10)] | [varchar(255)] | 表在
item, tag上具有唯一索引每个标签都有一个字符串“TAG##”的形式,其中“##”是一个数字 1-99
不保证现有标签是连续的,例如项目 13 可能有标签“TAG1”、“TAG3”、“TAG10”。
-
TASK:我需要将一堆新行从另一个表 T_NEW 插入到表中,该表只有项目和值,并为它们分配新标签,这样它们就不会违反唯一索引在
item, tag。值的唯一性无关紧要(假设 item+value 始终是唯一的)。
---- Table T_NEW -------------------------- | item | tag | value | | [int] | STARTS AS NULL | [varchar(255)] | -
问题:如何为表 T_NEW 中的所有行分配新标签,例如:
T 和 T_NEW 联合中的所有项目+标签组合都是唯一的
新分配的标签都应采用“TAG##”形式
理想情况下,新分配的标签应该是给定项目可用的最小标签。
如果有帮助,您可以假设我已经有一个临时表
#tags,其中的“标签”列包含 99 行包含所有有效标签(TAG1..TAG99,每行一个)
【问题讨论】:
-
所以你想从最低的可用标签号开始并填补空白?
-
@dotjoe - 差不多。不一定要 100% 完美,但如果 TAG1-96 是免费的,我不想从“TAG97”开始并在 4 行之后用完该项目的标签。
标签: sql tsql unique-constraint sap-ase