我刚刚意识到我一直在为表中的一列捕获错误的数据。我已经解决了这个问题,但到目前为止我捕获的数据仍然不正确。
让我们为我的表TableIWantToCorrect
和TableWithIDs
在TableIWantToCorrect
中,我有TableWithIDs
的外键。这是不正确的。
我可以通过将TableIWantToCorrect
中的列的子字符串与TableWithIDs
中的列进行比较来更正数据。
目前,我有
TableIWantToCorrect
Name ForeignKey
123-abc-123 15
456-def-456 15
789-ghi-789 15
TableWithIDs
CompareName id
abc 1
def 2
ghi 3
因此,当Name中的子字符串与Compare name中的子字符串相等时,我想更新TableIWantToCorrect
以获得正确的ForeignKey值。子串的位置始终相同,因此我可以使用Substring
方法。
我的尝试:
Update TableIWantToCorrect
SET ForeignKey =
(SELECT id
FROM TableWithIDs
WHERE UPPER(CompareName) = UPPER((SUBSTRING(TableIWantToCorrect.Name, 4, 3)))
结果:
子查询返回的值超过1。这是不允许的 子查询跟随=,!=,<,< =,>,> =或当子查询用作 一种表达。声明已经终止。
我知道我做了些傻事。我在这里做错了什么?
答案 0 :(得分:13)
错误是因为您的子查询返回UPDATE
的多个记录。要解决此问题,您可以使用JOIN
1> UPDATE
来执行此操作
UPDATE t1
SET ForeignKey = t2.id
FROM TableIWantToCorrect t1
INNER JOIN TableWithIDs t2
ON UPPER(t2.CompareName) = UPPER(SUBSTRING(t1.Name, 4, 3))
答案 1 :(得分:2)
Update TableIWantToCorrect
SET ForeignKey = s.id
FROM TableIWantToCorrect , TableWithIDs as s
WHERE UPPER(s.CompareName) = UPPER( (SUBSTRING(TableIWantToCorrect.Name, 4, 3))
答案 2 :(得分:-1)
--CREATE FUNCTION dbo.ufn_FindReports
--(@InEmpID INTEGER)
--RETURNS @retFindReports TABLE
--(
-- EmployeeID int primary key NOT NULL,
-- FirstName nvarchar(255) NOT NULL,
-- LastName nvarchar(255) NOT NULL,
-- JobTitle nvarchar(50) NOT NULL
--)
----Returns a result set that lists all the employees who report to the
----specific employee directly or indirectly.*/
--AS
--BEGIN
--WITH EMP_cte(EmployeeID, OrganizationNode, FirstName, LastName, JobTitle, RecursionLevel) -- CTE name and columns
-- AS (
-- SELECT e.EmployeeID, e.ManagerID, p.FirstName, p.LastName, P.JobTitle, 0 -- Get the initial list of Employees for Manager n
-- FROM HumanResources.Employee e
--INNER JOIN Person.Person p
--ON p.Employeeid = e.EmployeeID
-- WHERE e.EmployeeID = @InEmpID
-- UNION ALL
-- SELECT e.EmployeeID, e.ManagerID, p.FirstName, p.LastName, P.JobTitle, RecursionLevel + 1 -- Join recursive member to anchor
-- FROM HumanResources.Employee e
-- INNER JOIN EMP_cte
-- ON e.ORGANIZATIONNODE.GetAncestor(1) = EMP_cte.OrganizationNode
--INNER JOIN Person.Person p
--ON p.Employeeid= e.EmployeeID
-- )
---- copy the required columns to the result of the function
-- INSERT @retFindReports
-- SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel
-- FROM EMP_cte
-- RETURN
--END;
--GO
>