Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sửa lỗi Msg 512 “Truy vấn con trả về nhiều hơn 1 giá trị” trong SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách sửa đổi thời gian lưu giữ dữ liệu thu thập dữ liệu thay đổi (CDC) trong SQL Server - Hướng dẫn sử dụng SQL Server

  2. Làm cách nào để truy vấn các giá trị và thuộc tính Xml từ bảng trong SQL Server?

  3. Có phải mọi người đều đang di chuyển đến đám mây?

  4. Làm cách nào để chọn dữ liệu của một bảng từ một cơ sở dữ liệu khác trong SQL Server?

  5. Bảng tạm thời cục bộ và toàn cầu trong SQL Server