2009-07-16 70 views
10
1. Users 4 Cols 
UserID - UserName - RealName - Flags 

2. UsersGroups 2 Cols 
UserID - GroupID 

3. Groups 3 Cols 
GroupID - GroupName - Flags 

Điều tôi muốn làm là chọn Tên người dùng cụ thể là USERA và cập nhật cột cờ. nhưng tôi cũng muốn cập nhật cột Cờ trong bảng Nhóm thành cùng một giá trị.Lỗi tên cột mơ hồ, cách khắc phục sự cố?

UPDATE dbo.Users 
SET Flags = @var 
WHERE UserName = 'UserA' 

UPDATE dbo.Groups 
SET Flags = @var 
FROM dbo.Users u INNER JOIN dbo.UsersGroups ug ON u.UserID = ug.UserID 
INNER JOIN dbo.Groups g ON g.GroupID = ug.GroupID 
WHERE u.UserName = 'UserA' 

nhưng tôi tiếp tục nhận được: Tên cột mơ hồ 'Flags'.

nếu tôi làm Set Groups.Flags = @Var tôi nhận được: Msg 4104, Level 16, State 1, Line 1 Các đa phần nhận dạng "Groupy.Flags" không thể bị ràng buộc.

+0

Những câu trả lời mà nói g.Flags sử dụng không đúng vì bạn không thể sử dụng một bí danh trong một phần của CẬP NHẬT ... bạn cần sử dụng Groups.Flags ... lỗi là vì khi bạn tham gia vào việc bị nhầm lẫn về việc có nên cập nhật Cờ từ Người dùng hoặc Nhóm –

+0

@Chris hay không, tôi thường sử dụng bí danh bảng trong mệnh đề đã đặt, nhưng có các quy tắc cần tuân theo để cho phép điều đó. –

+0

Tôi nhận được cùng một lỗi bất kể nếu tôi sử dụng g hoặc Groups ... – Alan

Trả lời

1

youTableAlias.Flags

Trong ví dụ của bạn: g.Flags

18

Bạn cần phải thêm bí danh cho bảng Groups. Thay đổi này:

UPDATE dbo.Groups 
SET Flags = @var 
FROM dbo.Users u INNER JOIN dbo.UsersGroups ug ON u.UserID = ug.UserID 
INNER JOIN dbo.Groups g ON g.GroupID = ug.GroupID 
WHERE u.UserName = 'UserA' 

Để này:

UPDATE g -- change dbo.Groups here to simply 'g' 
SET g.Flags = @var 
FROM dbo.Users u INNER JOIN dbo.UsersGroups ug ON u.UserID = ug.UserID 
INNER JOIN dbo.Groups g ON g.GroupID = ug.GroupID 
WHERE u.UserName = 'UserA' 
+0

Msg 4104, Cấp 16, Tiểu bang 1, Dòng 1 Mã định danh nhiều phần "Group.Flags" không thể bị ràng buộc. – Alan

+0

Tôi nhận được lỗi đó nếu tôi sử dụng Groups.Flags ?? – Alan

+2

Tôi đã thay đổi phần đầu của câu lệnh UPDATE thành "UPDATE g" thay vì "UPDATE dbo.Groups". Hãy thử điều đó. –

2

Chỉ cần làm alias.Flags hoặc TableName.Flags trong báo cáo cập nhật.

Vì vậy, nó trở thành này:

UPDATE dbo.Users 
    SET Flags = @var 
    WHERE UserName = 'UserA' 

UPDATE g 
    SET g.Flags = @var 
FROM dbo.Users u 
INNER JOIN dbo.UsersGroups ug ON u.UserID = ug.UserID 
INNER JOIN dbo.Groups g  ON g.GroupID = ug.GroupID 
WHERE u.UserName = 'UserA' 
2
UPDATE dbo.Groups Set dbo.Groups.Flags = @var FROM dbo.Users u INNER JOIN dbo.UsersGroups ug ON u.UserID = ug.UserID INNER JOIN dbo.Groups g ON g.GroupID = ug.GroupID WHERE u.UserName = 'UserA' 
5

Vấn đề là bạn chưa xác định tên bảng cho trường "Flags" và nó có thể tồn tại trong nhiều hơn một bảng trong truy vấn. Thêm tên bảng theo định dạng "Tablename.flags" vào trước tất cả các tham chiếu để khắc phục sự cố.

2

Hãy thử Groups.Flags SET = @var trong bản cập nhật thứ hai của bạn

3
UPDATE g 
SET g.Flags = @var 
FROM 
    dbo.Groups g 
    INNER JOIN 
    dbo.UsersGroups ug 
    ON g.GroupID = ug.GroupID 
    INNER JOIN 
    dbo.Users u 
    ON u.UserID = ug.UserID 
WHERE u.UserName = 'UserA' 
  • Trong từ khoản - mục tiêu cập nhật cần phải được bảng đầu tiên ở đó.
  • Trong điều khoản cập nhật - sử dụng bí danh bảng được tạo trong mệnh đề từ.
  • Trong mệnh đề đã đặt - sử dụng bí danh bảng được tạo trong mệnh đề từ.

Tôi đã từng biết lý do mà điệu nhảy này cần phải được thực hiện theo cách này - bây giờ tôi chỉ làm điều đó theo thói quen. Tôi nghi ngờ nó có liên quan đến mệnh đề TỪ kép của TSQL trong các câu lệnh DELETE, và khả năng nói về hai trường hợp khác nhau của bảng Nhóm giữa mệnh đề FROM và UPDATE ... hoặc thậm chí hai trường hợp khác nhau của bảng Nhóm trong mệnh đề (nghĩ tự tham gia).

1

Dưới đây là một cách giải quyết (mặc dù có thể không phải là giải pháp tốt nhất):

UPDATE dbo.Groups 
SET Flags = @var 
FROM dbo.UsersGroups ug INNER JOIN dbo.Groups g ON g.GroupID = ug.GroupID 
WHERE ug.UserID IN (SELECT UserID FROM dbo.Users WHERE UserName = 'UserA') 
+0

Ah, ive vừa nhận ra, vì Im cố gắng đặt cờ thành SET dbo.Group.Flags = dbo. Group.Flags | 512 – Alan

+0

ok, tôi chỉ sử dụng chọn g.Flags từ dbo.Groups g INNER JOIN dbo.UsersGroups ug ON g.GroupID = ug.GroupID INNER JOIN dbo.Users u ON u.UserID = ug .UserID WHERE u.UserName = 'UserA' | 512 thay cho dbo. Group.Flags | 512 – Alan

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