1

我的大脑一片空白......我在尝试编写一个小脚本时遗漏了一些明显的东西:

我有一张带有各种 ID 的表:

TBL_USETHISID
nextid int

我有另一个参考表:

TBL_REFS
ref varchar(6)
thisdate datetime
nextid int

我想从 TBL_USETHISID 中获取 ID,然后更新 TBL_REFS,这样每一行的 ID 都比前一个多一个。然后,我将从 TBL_REFS 中选择 max(nextid) 并将 TBL_USETHISID 更新为最高值。

我对此有点挣扎,我们必须使用它而不是自动递增字段,因为这些 ID 用于多个表。

显然我已经尝试过:

UPDATE TBL_REFS FROM TBL_USETHISID
SET nextid = TBL_USETHISID.nextid + 1

感谢您提前提供的所有帮助。

编辑 - 样本数据:

TBLUSESID:

nextid
7001

TBL_REFS

ref       thisdate               nextid
0000123   2012-10-02 00:00:00        
0000124   2012-10-02 00:00:00 
0000125   2012-10-02 00:00:00 

更新后:

TBL_REFS

ref       thisdate               nextid
0000123   2012-10-02 00:00:00    7001    
0000124   2012-10-02 00:00:00    7002
0000125   2012-10-02 00:00:00    7003

然后我会 UPDATE TBL_USETHISID FROM TBL_REFS a set nextid = max(a.nextid)+1 来更新原始表。我希望我的格式是正确的,我认为代码是为了可读性。

4

3 回答 3

2

我强烈建议您使用序列。那是惯用的 Ingres 方法(实际上,序列是 SQL:2003 标准,如果我没记错的话,所以每个支持 SQL 的好 RDBMS 都应该支持它们)。

不幸的是,Actian 将文档移到了一个新系统,这使得创建指向描述某些内容的页面的直接链接非常困难,所以我不能在这里给你一个链接。请访问http://docs.actian.com,选择 Ingres 10 docs(在选项中),然后打开 SQL 参考。

简而言之,制作一个名为的序列,例如TBL_REFS_SEQ

CREATE SEQUENCE TBL_REFS_SEQ; -- Also grant it

然后您可以执行以下操作:

UPDATE TBL_REFS 
FROM TBL_USETHISID 
SET nextid = TBL_REFS_SEQ.NEXTVAL;

序列也有这个CURVAL属性。

注意:请记住,如果您希望某些用户/角色可以访问此新创建的序列,则需要授予权限。

来自Ingres 10.0 SQL 参考指南

特定序列上的 NEXT VALUE 或 CURRENT VALUE 表达式对由 INSERT 语句插入、由 UPDATE 语句更新或添加到 SELECT 语句的结果集中的每一行计算一次。如果在单个语句中对同一序列上多次出现的 NEXT VALUE 或 CURRENT VALUE 表达式进行编码,则该语句所涉及的每一行仅计算一个值。如果 NEXT VALUE 表达式和 CURRENT VALUE 表达式在同一语句中的相同序列上编码,则首先计算 NEXT VALUE 表达式,然后计算 CURRENT VALUE 表达式(确保它们返回相同的值),无论它们在语句中的顺序如何句法。

于 2014-05-23T19:32:31.273 回答
0

最简单的方法是通过,LOOPS虽然不是最有效的方法。也不确定其中的语法,ingres因为我从未研究过它。

也可以通过 CTE(再次不确定 CTE 是否在 ingres 中工作)。也将尝试为此提供解决方案。

直到那时检查下面的代码

--simulated table structure
DECLARE @TBLUSETHISID TABLE
(
    nextid INT
)

DECLARE @TBL_REFS TABLE
(
    ref varchar(6),
    thisdate datetime,
    nextid int
)

-- values for testing
INSERT INTO @TBLUSETHISID VALUES(7001);

INSERT INTO @TBL_REFS VALUES('000123', '2012-10-02 00:00:00', null);
INSERT INTO @TBL_REFS VALUES('000124', '2012-10-02 00:00:00', null);
INSERT INTO @TBL_REFS VALUES('000125', '2012-10-02 00:00:00', null);

--solution starts from here
DECLARE @StartCount INT, @TotalCount INT, @REF VARCHAR(6)

SELECT @TotalCount = COUNT(*) - 1 FROM @TBL_REFS;
SET @StartCount = 0;

WHILE(@StartCount <= @TotalCount)
BEGIN
    SELECT @REF = ref FROM (SELECT ROW_NUMBER() over(ORDER BY ref) AS ROWNUM, * FROM @TBL_REFS) as tbl WHERE ROWNUM = @StartCount + 1

    UPDATE @TBL_REFS
    SET nextid = (SELECT nextid + @StartCount FROM @TBLUSETHISID)
    WHERE ref = @REF

    SET @StartCount = @StartCount + 1

END

UPDATE @TBLUSETHISID
SET nextid = (SELECT MAX(nextid) + 1 FROM @TBL_REFS)

SELECT * FROM @TBLUSETHISID
SELECT * FROM @TBL_REFS

编辑:LOOP. 表格模拟和测试值插入仍然按照上述解决方案。当然,Ingres doesn't support scalar queries仍然存在问题,因此您必须为此找到解决方法。

UPDATE tbl2
SET nextid = (tbl.nextid + ROWNUM - 1) 
FROM
(SELECT ROW_NUMBER() over(ORDER BY ref) AS ROWNUM, 
ref,
thisdate,
(SELECT nextid FROM @TBLUSETHISID) AS nextid FROM @TBL_REFS) tbl
INNER JOIN @TBL_REFS tbl2
ON tbl.ref = tbl2.ref

希望这可以帮助

于 2014-05-12T10:49:43.937 回答
0

尝试这个,

UPDATE tbl_refs  SET nextid=(SELECT nextid+1 FROM tbl_usethisid)
于 2014-05-12T10:35:54.147 回答