2013-02-07 30 views
6

Tôi có 2 bảng:sql cập nhật bảng bộ - Mã nhận dạng đa phần không thể bị ràng buộc

  • Table1 = tên của trạm xăng (theo cặp)
  • Table2 = có đồng phối thông tin (kinh độ và vĩ độ giữa những thứ khác)

Ví dụ về Table1:

StationID1 StationID2 Name1 Name2 Lattitude1 Longitude1 Lattitude2 Longitude2 Distance 
------------------------------------------------------------------------------------------------ 
93353477 52452 FOO  BAR  NULL  NULL  NULL NULL NULL 
93353527 52452 HENRY BENNY NULL  NULL  NULL NULL NULL 
93353551 52452 GALE SAM  NULL  NULL  NULL NULL NULL 

Ví dụ về Table2:

IDInfo  Name Lattitude Longitude 
------------------------------------------- 
93353477 BAR 37.929654 -87.029622 

Tôi muốn cập nhật bảng này với các thông tin đó nằm trong tableA phối hợp. Tôi cố gắng làm những điều sau đây theo SQL Server 2005: The multi-part identifier … could not be bound

update table1 
set t1.[Lattitude1] = t2.[Lattitude] 
from table1 t1 
left join table2 t2 
on (t1.StationID1 = t2.IDInfo) 

tôi nhận được thông báo lỗi sau:

Msg 4104, Level 16, State 1, Line 1
Các đa phần nhận dạng "t1 .Lattitude1 "không thể bị ràng buộc.

Tuy nhiên, nếu tôi làm như sau thì tôi có thể lưu trữ vào bảng khác.

SELECT t1.[StationID1] 
     ,t1.[StationID2] 
     ,t1.[Name1] 
     ,t1.[Name2] 
     ,t2.[Lattitude] AS [Lattitude1] 
     ,t2.[Longitude] AS [Longitude1] 
     ,t3.[Lattitude] AS [Lattitude2] 
     ,t3.[Longitude] AS [Longitude2] 
from table1 t1 
left join table2 t2 
on (t1.StationID1 = t2.IDInfo) 
left join table2 t3 
on (t1.StationID2 = t2.IDInfo) 

Tôi rất mới với SQL và có một thời gian khó hiểu tại sao một số công việc và những thứ khác thì không. Dựa trên liên kết tôi đăng trên truy vấn ban đầu của tôi nên đã làm việc - không? Có lẽ tôi không nghĩ thẳng như tôi đã dành nhiều giờ cố gắng này và cuối cùng tôi đã nhận được sự giúp đỡ từ một đồng nghiệp (cô đề nghị phương pháp tôi đề cập ở trên).

Trả lời

12

Tôi nghĩ bạn có thể sửa đổi câu lệnh UPDATE của mình để tham chiếu bí danh bảng trong dòng UPDATE.

update t1 
set t1.[Lattitude1] = t2.[Lattitude] 
from table1 t1 
left join table2 t2 
on (t1.StationID1 = t2.IDInfo) 
+0

Tốt hơn là không sử dụng bí danh hoặc lặp lại table1 trong mệnh đề FROM: cập nhật table1 set Lattitude1 = table2.Lattitude từ table2, nơi table2.IDInfo = table1.StationID1. SQL Server của "UPDATE ... FROM" xây dựng là không chuẩn và - đặc biệt là khi bí danh được sử dụng - một chút bí ẩn. Nếu một bảng hoặc tên bí danh trong mệnh đề FROM khớp với những gì xuất hiện sau UPDATE, các bảng đó được xác định một cách kỳ diệu, nhưng điều này có thể bị hỏng nếu có truy vấn từ xa (xem trợ giúp cho UPDATE .. FROM và http://bit.ly/14EXoZP). –

+0

@cgatian, bobs - cảm ơn bạn rất nhiều vì đã giúp đỡ bạn. Cả hai giải pháp của bạn đều hoạt động. Tôi đã lưu ý vấn đề mà Steve Kass đề cập trong trường hợp. Cảm ơn tất cả. – codingknob

0

Bạn cần phải thay đổi bảng bên trong và cung cấp một cách khác nhau cho các cột tương tự. Điều này sẽ làm việc.

update table1 
set [Lattitude1] = x.[lat] 
from 
(
    SELECT IDInfo [id], Lattitude [lat] FROM 
    table2 
) x 
WHERE 
StationID1 = x.[id] 

Trong trường hợp cụ thể của bạn nó không cần thiết phải đổi tên Lattitude để lat, nhưng nếu bạn kết thúc việc cập nhật một bảng với chính nó và buộc mình vào cho các cột tên gọi khác nhau, nó sẽ giúp bạn tiết kiệm nhức đầu xuống đường.

Các vấn đề liên quan