是否可以在SQL2000中创建以下形式的组合键:
event_id id2
亚洲开发银行,中国,日本,中国,中国,日本,中国,日本,中国,中国
亚洲开发银行*2
亚洲开发银行、中国开发银行、中国投资银行、中国国际金融公司。
cfg*1
cfg *2
法国电力公司:法国电力公司,中国电力公司,中国电力公司,第一个法国电力公司。
其中id2在每次event_id改变时重新开始计数。我需要通过创建表或其他SELECT语句技巧使编号与此完全相同。
编辑:我可能还不清楚,我只是暂时需要这个表来连接。
发布于 2009-07-02 06:18:45
这是我给另一个帖子的答案,但它确切地展示了你所要求的:
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列添加到临时表中,并用新数字更新它,而不是每次都计算它。我在猜测什么时候更新性能会更好……测试正在进行中。
发布于 2009-06-24 17:13:53
我会避免将其称为身份,因为它不是,而且会让大多数其他人感到困惑。
我认为您必须通过插入触发器和围绕序列递增的事务锁定来完成此操作。
发布于 2009-06-24 17:33:07
你不能让SQL自动为你做这件事。
如果您确实不需要它,那么跳过它,您将需要查询表以获得下一个值,然后必须插入行,同时锁定selects,这样其他人就不会查询以获得相同的下一个值。
我称它为SEQuence,而不是ID,但是你会有一个更好的PK,只有一个普通的身份,而且你仍然可以有一个SEQ列。
https://stackoverflow.com/questions/1039703
复制相似问题