SQL update语句为表记录的每个不同子集填充数字序列
我需要SQL update语句将连续序列号分配给表中的记录子集。我正在使用MS access 假设当前表有如下记录: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 您
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定义的组的成员资格时,才需要在运行此查询之前删除这些记录。如果存在与这两个条件不匹配的外部记录,则可以将它们保留在表中,因为它们不会影响所选组中记录的编号他们只会有自己的独立编号,你可以忽略**
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中不起作用,但在我弄清楚如何修改语法之前,我想看看通用方法是否解决了我的问题。如果我正确理解了它的工作原理,那么它就不会解决问题。看起来我正在创建一个与真实数据表平行的表,其中包含一个额外的自动