首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有标识的sql组合键

带有标识的sql组合键
EN

Stack Overflow用户
提问于 2009-06-24 17:10:23
回答 5查看 2.6K关注 0票数 2

是否可以在SQL2000中创建以下形式的组合键:

event_id id2

亚洲开发银行,中国,日本,中国,中国,日本,中国,日本,中国,中国

亚洲开发银行*2

亚洲开发银行、中国开发银行、中国投资银行、中国国际金融公司。

cfg*1

cfg *2

法国电力公司:法国电力公司,中国电力公司,中国电力公司,第一个法国电力公司。

其中id2在每次event_id改变时重新开始计数。我需要通过创建表或其他SELECT语句技巧使编号与此完全相同。

编辑:我可能还不清楚,我只是暂时需要这个表来连接。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-07-02 06:18:45

这是我给另一个帖子的答案,但它确切地展示了你所要求的:

代码语言:javascript
运行
复制
SELECT
   seqid = identity(int, 1, 1),
   event_id,
   S.name
INTO #EventNames
FROM
   celcat200809.dbo.CT_EVENT_STAFF ES
   LEFT JOIN celcat200809.dbo.CT_STAFF S ON ES.staff_id = S.staff_id
ORDER BY
   event_id,
   S.name

SELECT
   EN.event_id,
   Max(CASE seqid - minseqid WHEN 0 THEN EN.name ELSE '' END))
   + Max(Coalesce(' + ' + CASE seqid - minseqid WHEN 1 THEN EN.name ELSE NULL END, ''))
   + Max(Coalesce(' + ' + CASE seqid - minseqid WHEN 2 THEN EN.name ELSE NULL END, ''))
   + Max(Coalesce(' + ' + CASE seqid - minseqid WHEN 3 THEN EN.name ELSE NULL END, ''))
   + Max(Coalesce(' + ' + CASE seqid - minseqid WHEN 4 THEN EN.name ELSE NULL END, ''))
   + Max(Coalesce(' + ' + CASE seqid - minseqid WHEN 5 THEN EN.name ELSE NULL END, ''))
   + Max(Coalesce(' + ' + CASE seqid - minseqid WHEN 6 THEN EN.name ELSE NULL END, ''))
   + Max(Coalesce(' + ' + CASE seqid - minseqid WHEN 7 THEN EN.name ELSE NULL END, ''))
   + Max(Coalesce(' + ' + CASE seqid - minseqid WHEN 8 THEN EN.name ELSE NULL END, ''))
   + Max(Coalesce(' + ' + CASE seqid - minseqid WHEN 9 THEN EN.name ELSE NULL END, ''))
   + Max(Coalesce(' + ' + CASE seqid - minseqid WHEN 10 THEN EN.name ELSE NULL END, ''))
FROM
   #EventNames EN
   INNER JOIN (
      SELECT event_id, minseqid = Min(seqid) FROM #EventNames GROUP BY event_id
   ) X ON EN.event_id = X.event_id
GROUP BY EN.event_id

您可以忽略10个Max()表达式。关键部分是:-将值粘贴到一个包含标识列的临时表中,该列按组排序。-使用聚合查询获得每个组的最小值(上面的派生表X)-从标识值中减去最小值(如果需要从1开始编号,则加1),结果是每个组的数字都从1重新开始!

如果要多次使用select的结果,那么在创建时将另一个int列添加到临时表中,并用新数字更新它,而不是每次都计算它。我在猜测什么时候更新性能会更好……测试正在进行中。

票数 0
EN

Stack Overflow用户

发布于 2009-06-24 17:13:53

我会避免将其称为身份,因为它不是,而且会让大多数其他人感到困惑。

我认为您必须通过插入触发器和围绕序列递增的事务锁定来完成此操作。

票数 2
EN

Stack Overflow用户

发布于 2009-06-24 17:33:07

你不能让SQL自动为你做这件事。

如果您确实不需要它,那么跳过它,您将需要查询表以获得下一个值,然后必须插入行,同时锁定selects,这样其他人就不会查询以获得相同的下一个值。

我称它为SEQuence,而不是ID,但是你会有一个更好的PK,只有一个普通的身份,而且你仍然可以有一个SEQ列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1039703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档