Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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
Mysql更新一行,如果它是唯一匹配的结果_Mysql_Sql - Fatal编程技术网

Mysql更新一行,如果它是唯一匹配的结果

Mysql更新一行,如果它是唯一匹配的结果,mysql,sql,Mysql,Sql,我有一张这样的桌子: Item --------- id parentId name inventoryNumber 当且仅当行 parentId=12345 名称字符串与给定字符串完全匹配 敏捷褐狐 该行是唯一与前两行匹配的行 标准 我相信如果我只是做一个选择,我知道如何做到这一点 SELECT * FROM Item WHERE parentId=12345 AND name LIKE 'The quick brown fox' HAVING count(*)=1 但我需要更新行 更新

我有一张这样的桌子:

Item
---------
id
parentId
name
inventoryNumber
当且仅当行

parentId=12345 名称字符串与给定字符串完全匹配 敏捷褐狐 该行是唯一与前两行匹配的行 标准 我相信如果我只是做一个选择,我知道如何做到这一点

SELECT * FROM Item WHERE parentId=12345 
AND name LIKE 'The quick brown fox' HAVING count(*)=1
但我需要更新行

更新项目集inventoryNumber=456,其中这是parentId=12345的唯一一行,也是name='the quick brown fox'的唯一一行

我有大约5000行要更新,所以如果我能在一条语句中找到一种更新的方法,这将大大减少我的工作量。这能做到吗

更新:我已经尝试将其放入子查询中,如:

UPDATE Item SET inventoryNumber = 456 WHERE id IN (
   SELECT id 
   FROM Item 
   WHERE parentId = 12345 AND name LIKE 'The quick brown fox' HAVING count(*)=1
);
但是我从MySql得到一个错误,当我这样做时,您不能在from子句中指定更新的目标表'item':

使用子查询如何:

编辑

使用子查询如何:

编辑

试试这个:-

Update Item set inventoryNumber = 456 where parentId=12345 and name = "The quick brown fox" group by parentId,name  having count(*) =1
试试这个:-

Update Item set inventoryNumber = 456 where parentId=12345 and name = "The quick brown fox" group by parentId,name  having count(*) =1
这是一本书

它使用以下SQL查询:

UPDATE Item SET Item.inventoryNumber = 200
WHERE  Item.id IN (
  SELECT A.id FROM (
    SELECT * FROM Item i GROUP BY i.parentId, i.name HAVING COUNT(*)=1
  ) AS A WHERE A.parentId = 12345 AND A.name = 'The quick brown fox'
)
查询明细:

最里面的查询:使用GROUP BY根据您的条件选择唯一的行3 下一步:根据条件1和2筛选出行 在UPDATE的WHERE子句中使用结果。 这是一本书

它使用以下SQL查询:

UPDATE Item SET Item.inventoryNumber = 200
WHERE  Item.id IN (
  SELECT A.id FROM (
    SELECT * FROM Item i GROUP BY i.parentId, i.name HAVING COUNT(*)=1
  ) AS A WHERE A.parentId = 12345 AND A.name = 'The quick brown fox'
)
查询明细:

最里面的查询:使用GROUP BY根据您的条件选择唯一的行3 下一步:根据条件1和2筛选出行 在UPDATE的WHERE子句中使用结果。
Hers是一种解决方案,它使用带有窗口函数的CTE来确保更新源中行的唯一性。在本例中,我们使用学生表中的ID更新主表,这些ID在名称和DOB上匹配,但前提是更新源中只有一行。它运行速度非常快,2秒,77K更新,tblMaster中有100K行,tblStudent中有225K行

;WITH CTE (StudentId, Fname, Mname, LName, DOB, RowCnt)
    as (
    SELECT StudentId, FirstName, MiddleName, LastName, DateOfBirth as DOB, SUM(1) OVER (Partition By FirstName, ISNULL(Left(MiddleName,1), ''), LastName, DateOfBirth) as RowCnt
    FROM tblStudent
    )
    UPDATE tblMaster
        SET ID = StudentID, MatchType = 'Exact'
    FROM CTE 
    WHERE (ID = 0 OR ID IS NULL)
      AND DateOfBirth = DOB
      AND FirstName = Fname 
      AND LastName = LName
      AND (MiddleName is Null OR Mname is Null OR Left(MiddleName, 1) = LEFT(Mname,1))
      AND RowCnt = 1

Hers是一种解决方案,它使用带有窗口函数的CTE来确保更新源中行的唯一性。在本例中,我们使用学生表中的ID更新主表,这些ID在名称和DOB上匹配,但前提是更新源中只有一行。它运行速度非常快,2秒,77K更新,tblMaster中有100K行,tblStudent中有225K行

;WITH CTE (StudentId, Fname, Mname, LName, DOB, RowCnt)
    as (
    SELECT StudentId, FirstName, MiddleName, LastName, DateOfBirth as DOB, SUM(1) OVER (Partition By FirstName, ISNULL(Left(MiddleName,1), ''), LastName, DateOfBirth) as RowCnt
    FROM tblStudent
    )
    UPDATE tblMaster
        SET ID = StudentID, MatchType = 'Exact'
    FROM CTE 
    WHERE (ID = 0 OR ID IS NULL)
      AND DateOfBirth = DOB
      AND FirstName = Fname 
      AND LastName = LName
      AND (MiddleName is Null OR Mname is Null OR Left(MiddleName, 1) = LEFT(Mname,1))
      AND RowCnt = 1

我试过了,但我得到了一个错误…您不能从clauseTake再次查看kasdega中指定更新的目标表'item'。我希望它能解决你的问题。干杯。我的表很大,所以我对INSERT INTO语句进行了限定,并不得不更新update/select语句以达到索引,但除此之外,该解决方案有效。非常感谢。我试过了,但我得到了一个错误…您不能从clauseTake再次查看kasdega中指定更新的目标表'item'。我希望它能解决你的问题。干杯。我的表很大,所以我对INSERT INTO语句进行了限定,并不得不更新update/select语句以达到索引,但除此之外,该解决方案有效。非常感谢。