2012-07-11 25 views
5

Masamda bir sütun için yanlış verileri yakaladığımı fark ettim. Sorunu çözdüm, ancak şu ana kadar yakaladığım veriler hatalı.Başka bir tablo verisini kullanarak bir sütun verileri nasıl güncellenir TSQL

Let ismi benim tabloları TableIWantToCorrect yılında TableIWantToCorrect ve TableWithIDs

, ben TableWithIDs için yabancı bir anahtara sahip. Bu yanlış olan şey.

TableIWantToCorrect numaralı sütunda bir sütunun alt dizesini TableWithIDs numaralı sütunda karşılaştırarak verileri düzeltebiliyorum.

Yani şu anda, ben

TableIWantToCorrect

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

TableWithIDs

CompareName id 
abc   1 
def   2 
ghi   3 

yüzden doğru ForeignKey değere sahip TableIWantToCorrect güncelleştirmek istediğiniz varken de alt dize Ad, alt dizeye eşittir Adı karşılaştır. Alt dizenin konumu her zaman aynıdır, böylece Substring yöntemini kullanabilirim.

girişimim:

Update TableIWantToCorrect 
SET ForeignKey = 
     (SELECT id 
     FROM TableWithIDs 
     WHERE UPPER(CompareName) = UPPER((SUBSTRING(TableIWantToCorrect.Name, 4, 3))) 

sonucu:

Alt sorgu 1'den fazla değer döndürdü. alt sorgusu =,! =, <, < =,>,> = veya alt sorgu bir ifade olarak olarak kullanıldığında bu izin verilmez. Açıklama feshedildi.

Aptalca bir şey yaptığımı biliyorum. Burada yanlış ne yaptım? sizin alt sorgu UPDATE için birden fazla kayıt döndürmesi nedeniyle

+1

Sizin inline-sorgu ile bir JOIN kullanarak bunu yapabilirsiniz. olanları tekrar hangi anlamaya bu sorguyu çalıştırın 'CompareName TARAFINDAN CompareName, COUNT (1) TableWithIDs GELEN \t GRUBU SEÇ size alt sorgu değiştirirseniz COUNT (1)> 1 \t ' – Chandu

+0

hata almaya devam mı HAVING SELECT DISTINCT kimliğini kullan? Eğer varsa, olası birden fazla eşleşme vardır ve hangisinin kullanılacağı belirsizdir. –

+0

[SQL Server kullanarak SELECT'ten GÜNCELLEŞTİRME] 'nin olası bir kopyası (http://stackoverflow.com/questions/2334712/update-from-select-using-sql-server) –

cevap

13

hatadır. Bunu düzeltmek için, dolayısıyla konuyu daha o bir satır dönüyor senin 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

Bunun özellikle bir SQL Server sorusu olduğunu biliyorum, ancak bunu yapmak için MySQL eşdeğerlerini istiyorsanız, şu adresi deneyin: http://stackoverflow.com/a/11709090/403264 – JonRed

2
Update TableIWantToCorrect 
SET ForeignKey = s.id 
FROM TableIWantToCorrect , TableWithIDs as s 
WHERE UPPER(s.CompareName) = UPPER((SUBSTRING(TableIWantToCorrect.Name, 4, 3)) 
+1

Oracle'da kimin çalıştığını her zaman söyleyebilirsiniz, asla kullanmazlar birleştirme komutu. ;) – Limey

+1

Ne yazık ki Oracle ve Sql sunucu arasında gidip geldiğimde biraz kafam karıştı ..!yine de aynı sonucu veriyorlar ama yine de tercih edilmeli .http: //stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause – praveen

+1

Oracle'da 10 yaşındaydım ve ondan nefret ediyordum. Beyannameye katıl! Bazı nedenlerden dolayı, her zaman okumayı zor buldum, ancak SQL Server'da yıllar sonra, yollarımın hatalarını gördüm ve her zaman katılımları kullanıyorum. – Limey

-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 

> 
İlgili konular