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语句以达到索引,但除此之外,该解决方案有效。非常感谢。