SQL update语句为表记录的每个不同子集填充数字序列

SQL update语句为表记录的每个不同子集填充数字序列,sql,ms-access,Sql,Ms Access,我需要SQL update语句将连续序列号分配给表中的记录子集。我正在使用MS access 假设当前表有如下记录: notebook,blue notebook.Yellow pencil,yellow chair,blue desk,green desk,blue 我想向表中添加另一个字段,并按如下方式填充它: notebook,blue,1 notebook.Yellow,1 pencil,yellow,2 chair,blue,2 desk,green,1 desk,blue,3 您

我需要SQL update语句将连续序列号分配给表中的记录子集。我正在使用MS access

假设当前表有如下记录:

notebook,blue
notebook.Yellow
pencil,yellow
chair,blue
desk,green
desk,blue
我想向表中添加另一个字段,并按如下方式填充它:

notebook,blue,1
notebook.Yellow,1
pencil,yellow,2
chair,blue,2
desk,green,1
desk,blue,3
您可以看到,我根据一组特定的标准分配了一个连续的数字。在本例中,条件在第二个字段中是一个不同的值(在现实生活中,条件将是来自多个字段的值的不同组合,但所有相关字段都在同一个表中…不需要联接即可获得条件)。由于字段2中有三条带蓝色的记录,因此编号为1,2,3。因为有两条记录是黄色的,所以它们被编号为1,2

所以我不能从行号推导出编号,因为我在同一个表中有几个编号系列,都是从1开始的

此外,我需要它是一个查询,其中不必在第二个字段中显式指定值。我只希望第二个字段中的每个唯一值都有自己的编号序列。也就是说,我不想显式地编写一个查询来生成“blue”的数字,而编写一个单独的查询来生成“yellow”的数字

序列中的最大记录数在1000以下。所以我不介意是否需要创建一个包含1000条记录的辅助表,其中一个字段包含1到1000的值。然后,主表的update语句可以从辅助表中提取下一个值


但我不知道该update语句或任何其他方法的update语句使用的SQL语法。所以我需要你的建议。

我不知道如何用一条SQL语句来实现这一点,但这里有两条SQL语句可用于处理每种情况:

insert into table ('desk', 'blue', 1)
where not exists (select field3 from table where field1 = 'desk' and field2 = 'blue');

insert into table (field1, field2, field3)
select field1, field2, count(1) + 1
from table
where field1 = 'desk'
and field2 = 'blue'
group by field1, field2;
---从临时表中获取所有值

SELECT * FROM #TableAutoIncrement

我的一位同事计算出了必要的SQL。这是一个通用的解决方案(请注意,我确实需要根据两个字段的组合对数据集中的多个系列进行编号。在我在原始帖子中的简化示例中,我只使用了一个字段——颜色——但因为我真的需要两个字段,这就是我在这个解决方案中展示的内容

SELECT *,
(SELECT COUNT(T1.ID)  
FROM 
[TableName] AS T1  
WHERE T1.ID >= T2.ID  and t1.[NameCriteriaField1] = t2.[NameCriteriaField1] 
and t1.[NameCriteriaField2]= t2.[NameCriteriaField2]) 
AS Sequence into OutputResultsTableName
FROM  
[TableName] AS T2  
ORDER BY  [NameCriteriaField2] , [NameCriteriaField1]
源表以“ID”作为带整数值的字段设置。每个记录都有一个唯一的ID值,但ID中是否有间隙或记录如何根据ID排序并不重要(例如,典型的MS access自动编号主键字段用于此目的)

设置此查询是为了假设数据集中有两个字段,您要使用它们对记录进行分组,并为每个组中的每个记录分配一个数字系列计数。(因此,您的表可能包含多个组,每个组都有自己的编号系列,以1开头。但按照查询的方式,定义组的条件正好有两个。)您不能使用任何where子句来进一步过滤已计数的记录。通过实验,我发现添加where子句会产生不可靠的结果,因为记录可能会被忽略。因此,如果您需要过滤结果,以便某些记录不会包含在特定组的数字序列中,请执行以下操作之一:在运行我的查询之前,请执行以下操作:

  • 运行查询以从源表中删除不需要的记录

  • 首先将源表中的所有记录复制到新表中,并从新表中删除不应编号的记录,然后在新表上运行我的查询

  • 仅当外部记录符合条件1和条件2定义的组的成员资格时,才需要在运行此查询之前删除这些记录。如果存在与这两个条件不匹配的外部记录,则可以将它们保留在表中,因为它们不会影响所选组中记录的编号他们只会有自己的独立编号,你可以忽略**

每个组的编号从1开始,查询根据criteria1和criteria2的不同组合动态定义组。但是,如果您有不属于任何组的记录,这些记录都将以0编号。(criteria1和criteria2——至少在我的测试范围内——是非空值。)。(理论上——至少在Microsoft Access上,空字符串不同于Null,但我也没有用空字符串测试这一点。)如果在标准1或准则2字段中有空的记录,MS Access将这些记录视为不属于任何组,因此将它们编号为0。也就是说,这些不同的组需要用非空值定义TyfIA1和VeriaI2,因此这与SQL不同语句的工作方式不同。

如果您需要将NULL作为定义组的有效条件(从而使组由NULL编号),这非常简单。在运行我的查询之前,首先运行一条update语句,将criteria1或criteria2中NULL值的所有实例更改为短语“NULL字段的占位符”。然后运行我的查询。在结果集中(将编号分配给组后),运行另一个更新以将所有出现的占位符短语更改回null

如果您的组仅由一个字段标准定义,则调整语法

SELECT *,
(SELECT COUNT(T1.ID)  
FROM 
[TableName] AS T1  
WHERE T1.ID >= T2.ID  and t1.[NameCriteriaField1] = t2.[NameCriteriaField1] )
AS Sequence into OutputResultsTableName
FROM  
[TableName] AS T2  
ORDER BY  [NameCriteriaField2] , [NameCriteriaField1]
SELECT *,
(SELECT COUNT(T1.ID)  
FROM 
[TableName] AS T1  
WHERE T1.ID >= T2.ID  and t1.[NameCriteriaField1] = t2.[NameCriteriaField1] 
and t1.[NameCriteriaField2]= t2.[NameCriteriaField2] 
and t1.[NameCriteriaField3]= t2.[NameCriteriaField3]) 
AS Sequence into OutputResultsTableName
FROM  
[TableName] AS T2  
ORDER BY  [NameCriteriaField2] , [NameCriteriaField1]
如果您的组由3个字段标准组合定义,则调整语法

SELECT *,
(SELECT COUNT(T1.ID)  
FROM 
[TableName] AS T1  
WHERE T1.ID >= T2.ID  and t1.[NameCriteriaField1] = t2.[NameCriteriaField1] )
AS Sequence into OutputResultsTableName
FROM  
[TableName] AS T2  
ORDER BY  [NameCriteriaField2] , [NameCriteriaField1]
SELECT *,
(SELECT COUNT(T1.ID)  
FROM 
[TableName] AS T1  
WHERE T1.ID >= T2.ID  and t1.[NameCriteriaField1] = t2.[NameCriteriaField1] 
and t1.[NameCriteriaField2]= t2.[NameCriteriaField2] 
and t1.[NameCriteriaField3]= t2.[NameCriteriaField3]) 
AS Sequence into OutputResultsTableName
FROM  
[TableName] AS T2  
ORDER BY  [NameCriteriaField2] , [NameCriteriaField1]

语法在MS access中不起作用,但在我弄清楚如何修改语法之前,我想看看通用方法是否解决了我的问题。如果我正确理解了它的工作原理,那么它就不会解决问题。看起来我正在创建一个与真实数据表平行的表,其中包含一个额外的自动