Nếu bạn gặp lỗi Msg 512 có nội dung “Truy vấn con trả về nhiều hơn 1 giá trị…” trong SQL Server, đó là do bạn đang sử dụng truy vấn con trả về nhiều giá trị trong một trường hợp không được phép.
Ví dụ về Lỗi
Giả sử chúng ta có hai bảng sau:
SELECT * FROM Dogs;
SELECT * FROM Cats;
Kết quả:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 4 | Fluffy | +---------+-----------+ +---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Và chúng tôi chạy truy vấn sau đối với hai bảng đó:
SELECT * FROM Dogs
WHERE DogName = ( SELECT CatName FROM Cats );
Kết quả:
Msg 512, Level 16, State 1, Line 1 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Chúng tôi có thể thấy rằng nó dẫn đến lỗi Msg 512.
Thông báo lỗi này cho chúng ta biết rõ ràng rằng “Truy vấn con trả về nhiều hơn 1 giá trị” và “Điều này không được phép khi truy vấn con theo sau =,! =, <, <=,>,> =Hoặc khi truy vấn con được sử dụng như một biểu thức ”.
Giải pháp cho điều này sẽ phụ thuộc vào những gì bạn đang cố gắng thực hiện trong truy vấn. Dưới đây là một số tùy chọn để giải quyết vấn đề này.
Giải pháp 1
Một cách để giải quyết vấn đề này là sử dụng một toán tử khác. Ý tôi là, sử dụng toán tử khác với =
, !=
, <
, <=
, >
hoặc >=
.
Đây là một ví dụ sử dụng IN
nhà điều hành:
SELECT * FROM Dogs
WHERE DogName IN ( SELECT CatName FROM Cats );
Kết quả:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
Giải pháp 2
Một tùy chọn khác là giữ bằng (=
) toán tử (hoặc bất kỳ toán tử nào trong truy vấn ban đầu), nhưng hãy thay đổi truy vấn con.
Dưới đây là một ví dụ về việc thay đổi truy vấn con, trong khi vẫn giữ toán tử bằng:
SELECT * FROM Dogs
WHERE DogName = ( SELECT CatName FROM Cats WHERE CatId = 2 );
Kết quả:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
Trong trường hợp này, truy vấn con chỉ trả về một giá trị và toán tử bằng tốt với điều đó.
Giải pháp 3
Lưu ý rằng các truy vấn con trên chỉ trả về một cột. Nếu các truy vấn con trả về nhiều cột, chúng tôi cần thay đổi truy vấn bên ngoài để nó sử dụng EXISTS
nhà điều hành.
Ví dụ:
SELECT * FROM Dogs d
WHERE EXISTS ( SELECT * FROM Cats c WHERE c.CatName = d.DogName );
Kết quả:
+---------+-----------+ | DogId | DogName | |---------+-----------| | 2 | Fluffy | | 4 | Fluffy | +---------+-----------+
Nếu chúng tôi không thay đổi nó để sử dụng EXISTS
thì chúng tôi có thể nhận được thông báo lỗi 116.