Jak zaktualizować dane niektórych kolumn danymi z innych tabel TSQL


Właśnie zdałem sobie sprawę, że zbieram nieprawidłowe dane dla jednej kolumny w mojej tabeli. Naprawiłem ten problem, jednak dotychczas zebrane dane pozostają niepoprawne.
Nazwijmy moje tabele
TableIWantToCorrect
i
TableWithIDs
W
TableIWantToCorrect
mam klucz obcy do
TableWithIDs
. Oto, co jest nie tak.
Mogę poprawić dane, porównując podciąg kolumny w
TableIWantToCorrect
z kolumną w
TableWithIDs
.
Więc obecnie mam

TableIWantToCorrect

Name ForeignKey
123-abc-123 15
456-def-456 15
789-ghi-789 15


TableWithIDs

CompareName id
abc 1
def 2
ghi 3

Dlatego chcę zaktualizować
TableIWantToCorrect
, aby mieć poprawny ForeignKey, gdy podciąg w nazwie jest równy podciągowi w nazwie porównania. Pozycja podłańcucha jest zawsze taka sama, więc mogę użyć metody
Substring
.
Moja próba:
Update TableIWantToCorrect
SET ForeignKey =
(SELECT id
FROM TableWithIDs
WHERE UPPER(CompareName) = UPPER((SUBSTRING(TableIWantToCorrect.Name, 4, 3)))

Wynik:

Podzapytanie zwróciło więcej niż 1 wartość. Nie jest to dozwolone, kiedy
następuje podzapytanie = ,! =, & <, & < =, & >, & > = lub gdy podzapytanie jest używane jako
wyrażenia. Aplikacja została odrzucona.

Wiem, że zrobiłem coś głupiego. Co tu zrobiłem źle?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Błąd polega na tym, że podzapytanie zwraca więcej niż jeden rekord dla
UPDATE
. Aby to naprawić, możesz to zrobić za pomocą
JOIN
z
UPDATE
UPDATE t1
SET ForeignKey = t2.id
FROM TableIWantToCorrect t1
INNER JOIN TableWithIDs t2
ON UPPER(t2.CompareName) = UPPER(SUBSTRING(t1.Name, 4, 3))
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Update TableIWantToCorrect
SET ForeignKey = s.id
FROM TableIWantToCorrect , TableWithIDs as s
WHERE UPPER(s.CompareName) = UPPER( (SUBSTRING(TableIWantToCorrect.Name, 4, 3))
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

--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>

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się