Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Perbaiki Msg 512 "Subquery mengembalikan lebih dari 1 nilai" di SQL Server

Jika Anda mendapatkan pesan kesalahan 512 yang berbunyi "Subquery mengembalikan lebih dari 1 nilai ..." di SQL Server, itu karena Anda menggunakan subquery yang mengembalikan lebih dari satu nilai dalam skenario di mana ini tidak diperbolehkan.

Contoh Kesalahan

Misalkan kita memiliki dua tabel berikut:

SELECT * FROM Dogs;

SELECT * FROM Cats;

Hasil:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
| 4       | Fluffy    |
+---------+-----------+

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

Dan kami menjalankan kueri berikut terhadap dua tabel tersebut:

SELECT * FROM Dogs 
WHERE DogName = ( SELECT CatName FROM Cats );

Hasil:

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.

Kita dapat melihat bahwa itu menghasilkan kesalahan Msg 512.

Pesan kesalahan ini secara eksplisit memberi tahu kita bahwa “Subquery mengembalikan lebih dari 1 nilai” dan bahwa “Ini tidak diizinkan ketika subquery mengikuti =, !=, <, <=,>,>=atau ketika subquery digunakan sebagai ekspresi ”.

Solusi untuk ini akan bergantung pada apa yang Anda coba lakukan dalam kueri. Berikut adalah beberapa opsi untuk menyelesaikan masalah ini.

Solusi 1

Salah satu cara untuk mengatasinya adalah dengan menggunakan operator yang berbeda. Yang saya maksud adalah, gunakan operator selain = , != , < , <= , > , atau >= .

Berikut adalah contoh yang menggunakan IN operator:

SELECT * FROM Dogs 
WHERE DogName IN ( SELECT CatName FROM Cats );

Hasil:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 2       | Fluffy    |
| 4       | Fluffy    |
+---------+-----------+

Solusi 2

Pilihan lain adalah menjaga persamaan (= ) operator (atau operator mana pun dalam kueri asli), tetapi ubah subkueri.

Berikut ini contoh mengubah subquery, sambil mempertahankan operator yang sama:

SELECT * FROM Dogs 
WHERE DogName = ( SELECT CatName FROM Cats WHERE CatId = 2 );

Hasil:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 2       | Fluffy    |
| 4       | Fluffy    |
+---------+-----------+

Dalam hal ini subquery hanya mengembalikan satu nilai, dan operator equals tidak masalah dengan itu.

Solusi 3

Perhatikan bahwa subquery di atas hanya mengembalikan satu kolom. Jika subkueri mengembalikan beberapa kolom, kita perlu mengubah kueri luar agar menggunakan kode EXISTS operator.

Contoh:

SELECT * FROM Dogs d
WHERE EXISTS ( SELECT * FROM Cats c WHERE c.CatName = d.DogName );

Hasil:

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 2       | Fluffy    |
| 4       | Fluffy    |
+---------+-----------+

Jika kami tidak mengubahnya untuk menggunakan EXISTS operator, maka kita mungkin akan mendapatkan pesan kesalahan 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. Cara Mengimpor Database SQL Server ke Access 2016

  2. datetime vs smalldatetime di SQL Server:Apa Bedanya?

  3. Menggunakan fungsi COALESCE untuk membuat nilai dipisahkan dengan koma

  4. SQL OUTPUT Stored Procedures tidak berfungsi dengan ExecuteReader

  5. Apa metode terbaik untuk meneruskan parameter ke SQLCommand?