Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新包含重复信息的记录中的字段值_Sql_Ms Access_Ms Access 2010 - Fatal编程技术网

Sql 更新包含重复信息的记录中的字段值

Sql 更新包含重复信息的记录中的字段值,sql,ms-access,ms-access-2010,Sql,Ms Access,Ms Access 2010,我有一个查询,返回在多个部门中包含单词“PACK”的所有记录。。。字段(一个记录中最多出现两次单词“PACK”,并且都在字段中单独出现): 该查询非常有效,并返回在多个部门中包含“PACK”的所有记录。。。领域。现在我需要将这些记录中的第一个“PACK”实例更改为“PACK-M”,将这些记录中的第二个“PACK”实例更改为“PACK-S” 要查看查询中返回的两条记录的图片,请转到此处: 两条记录的“PACK”一词在不同字段中出现两次。我希望将每个记录中的第一个实例重新写入“PACK-M”,第二

我有一个查询,返回在多个部门中包含单词“PACK”的所有记录。。。字段(一个记录中最多出现两次单词“PACK”,并且都在字段中单独出现):

该查询非常有效,并返回在多个部门中包含“PACK”的所有记录。。。领域。现在我需要将这些记录中的第一个“PACK”实例更改为“PACK-M”,将这些记录中的第二个“PACK”实例更改为“PACK-S”

要查看查询中返回的两条记录的图片,请转到此处:


两条记录的“PACK”一词在不同字段中出现两次。我希望将每个记录中的第一个实例重新写入“PACK-M”,第二个实例重新写入“PACK-S”没有VBA,只有SQL。

我认为这应该可以解决问题

只需在打开
记录集的SQL语句中更改表名即可

Dim t1 As String
Dim t2 As String
Dim p1 As String
Dim p2 As String

p1 = "PACK-M"
p2 = "PACK-S"

Dim MyDB As DAO.Database
Dim rst As DAO.Recordset

Set MyDB = CurrentDb
Set rst = MyDB.OpenRecordset("SELECT * FROM PRAYING") 'Change PRAYING to your table name Or change the string to your query name


With rst
Do While Not .EOF
        For i = 0 To .Fields.Count - 1
            If .Fields(i).Value = "PACK" And t1 <> p1 Then
                .Edit
                .Fields(i).Value = "PACK-M"
                .Update
                t1 = p1
            ElseIf .Fields(i).Value = "PACK" Then
                .Edit
                .Fields(i).Value = "PACK-S"
                .Update
                t2 = p2
            End If
        Next
    .MoveNext
    t1 = ""
    t2 = ""
Loop
End With

rst.Close
Set rst = Nothing
Dim t1作为字符串
将t2变暗为字符串
将p1设置为字符串
将p2设置为字符串
p1=“PACK-M”
p2=“包装-S”
Dim MyDB作为DAO.Database
将rst设置为DAO.Recordset
设置MyDB=CurrentDb
Set rst=MyDB.OpenRecordset(“SELECT*FROM PRAYING”)'将PRAYING更改为表名或将字符串更改为查询名
用rst
做而不做
对于i=0到.Fields.Count-1
如果.Fields(i).Value=“PACK”和t1 p1,则
编辑
.Fields(i).Value=“PACK-M”
.更新
t1=p1
ElseIf.Fields(i).Value=“打包”然后
编辑
.Fields(i).Value=“PACK-S”
.更新
t2=p2
如果结束
下一个
.下一步
t1=“”
t2=“”
环
以
rst.关闭
设置rst=无

注意:您的问题中没有任何内容说明这必须是SQL,因此如果VBA不是您应该指定的选项。

我认为这应该可以解决问题

只需在打开
记录集的SQL语句中更改表名即可

Dim t1 As String
Dim t2 As String
Dim p1 As String
Dim p2 As String

p1 = "PACK-M"
p2 = "PACK-S"

Dim MyDB As DAO.Database
Dim rst As DAO.Recordset

Set MyDB = CurrentDb
Set rst = MyDB.OpenRecordset("SELECT * FROM PRAYING") 'Change PRAYING to your table name Or change the string to your query name


With rst
Do While Not .EOF
        For i = 0 To .Fields.Count - 1
            If .Fields(i).Value = "PACK" And t1 <> p1 Then
                .Edit
                .Fields(i).Value = "PACK-M"
                .Update
                t1 = p1
            ElseIf .Fields(i).Value = "PACK" Then
                .Edit
                .Fields(i).Value = "PACK-S"
                .Update
                t2 = p2
            End If
        Next
    .MoveNext
    t1 = ""
    t2 = ""
Loop
End With

rst.Close
Set rst = Nothing
Dim t1作为字符串
将t2变暗为字符串
将p1设置为字符串
将p2设置为字符串
p1=“PACK-M”
p2=“包装-S”
Dim MyDB作为DAO.Database
将rst设置为DAO.Recordset
设置MyDB=CurrentDb
Set rst=MyDB.OpenRecordset(“SELECT*FROM PRAYING”)'将PRAYING更改为表名或将字符串更改为查询名
用rst
做而不做
对于i=0到.Fields.Count-1
如果.Fields(i).Value=“PACK”和t1 p1,则
编辑
.Fields(i).Value=“PACK-M”
.更新
t1=p1
ElseIf.Fields(i).Value=“打包”然后
编辑
.Fields(i).Value=“PACK-S”
.更新
t2=p2
如果结束
下一个
.下一步
t1=“”
t2=“”
环
以
rst.关闭
设置rst=无

注意:您的问题中没有提到这必须是SQL,因此如果VBA不是您应该指定的选项。

您可以使用二进制方案来识别值来自哪些列

因此,例如,按照您的方式使用查询(为了便于键入,我正在减少列数)

请注意,'WHERE'子句必须更改,因为查找大于1的总和将产生误报。所以,你可以改变它,看看总和是否是2的幂。我正在使用基数为2的“log”函数,然后检查结果是否为整数。若要检查值是否为整数,可以附加“.0e0”并检查isnumeric

检查此“黑客”的来源

然后,您可以检查“sum”值以确定最小的位,以确定需要使用“PACKM”更新的列,较大的位将是需要使用“PACKS”更新的列


*免责声明:我没有提供“更新”脚本作为我答案的一部分。我还没有测试我的“SELECT”语句和“WHERE”逻辑。我只是希望我已经提供了足够的解释,用一些坚实的理由为你指明了正确的方向。希望这对您有所帮助。

您可以使用二进制方案来识别值来自哪些列

因此,例如,按照您的方式使用查询(为了便于键入,我正在减少列数)

请注意,'WHERE'子句必须更改,因为查找大于1的总和将产生误报。所以,你可以改变它,看看总和是否是2的幂。我正在使用基数为2的“log”函数,然后检查结果是否为整数。若要检查值是否为整数,可以附加“.0e0”并检查isnumeric

检查此“黑客”的来源

然后,您可以检查“sum”值以确定最小的位,以确定需要使用“PACKM”更新的列,较大的位将是需要使用“PACKS”更新的列


*免责声明:我没有提供“更新”脚本作为我答案的一部分。我还没有测试我的“SELECT”语句和“WHERE”逻辑。我只是希望我已经提供了足够的解释,用一些坚实的理由为你指明了正确的方向。希望这对您有所帮助。

您能添加示例数据+预期结果吗please@Bulat请参见编辑。对于查询返回的示例数据的图片,请转到我希望这是正确的时间,您着手重新设计您的表。最左边列中的代码是否唯一?当您说“更改单词”时,是否意味着重新写入表数据,或者在保持数据不变的情况下更改显示的值?是否可以添加样本数据+预期结果please@Bulat请参见编辑。对于查询返回的示例数据的图片,请转到我希望这是正确的时间,您着手重新设计表。最左边列中的代码是否唯一?当您说“更改单词”时,您的意思是重新写入表数据,还是在保持数据不变的情况下更改显示的值?看起来很不错。可以重构一点…
t2
没有使用,Boolea
SELECT *
FROM
(
  SELECT s.*,
    IIf(s.DeptOne = "Pack", 2, 0) AS D1,
    IIf(s.DeptTwo = "Pack", 4, 0) AS D2,
    IIf(s.DeptThree = "Pack", 8, 0) AS D3,
    IIf(s.DeptFour = "Pack", 16, 0) AS D4,
    IIf(s.DeptFive = "Pack", 32, 0) AS D5,
    IIf(s.DeptSix = "Pack", 64, 0) AS D6,
    IIf(s.DeptSeven = "Pack", 128, 0) AS D7,
    IIf(s.DeptEight = "Pack", 256, 0) AS D8,
    IIf(s.DeptNine = "Pack", 512, 0) AS D9,
    IIf(s.DeptTen = "Pack", 1024, 0) AS D10
FROM MyTable s
) m
WHERE ISNUMERIC( LOG( (m.D1 + m.D2 + m.D3 + m.D4 + m.D5 + m.D6 + m.D7 + m.D8 + 
       m.D9 + m.D10 ), 2 ) + '.0e0' )