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

Sửa lỗi “ORA-01789:khối truy vấn có số cột kết quả không chính xác”

Nếu bạn gặp lỗi “ORA-01789:khối truy vấn có số cột kết quả không chính xác” trong Cơ sở dữ liệu Oracle, thì có thể là do bạn đang cố sử dụng một toán tử chẳng hạn như UNION , INTERSECT hoặc EXCEPT để chạy một truy vấn kết hợp, nhưng SELECT các câu lệnh ở hai bên của toán tử trả về một số cột khác nhau.

Để khắc phục điều này, chỉ cần đảm bảo rằng cả hai truy vấn đều trả về cùng một số cột.

Ví dụ về Lỗi

Dưới đây là một ví dụ về mã tạo ra lỗi:

SELECT EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;

Kết quả:

ORA-01789: query block has incorrect number of result columns

Đây, tôi đang sử dụng UNION toán tử để tạo một truy vấn phức hợp. Rất tiếc, tôi gặp lỗi vì tôi chỉ đưa vào một cột trong truy vấn đầu tiên, nhưng hai cột trong truy vấn thứ hai.

Giải pháp

Cách để khắc phục sự cố này là đảm bảo cả hai truy vấn trả về cùng một số cột.

Vì vậy, chúng ta có thể thêm một cột mới vào SELECT đầu tiên tuyên bố:

SELECT EmployeeId, EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;

Kết quả:

EMPLOYEEID NHÂN VIÊN
1 Bart
1 Mia
2 tháng 1
2 Rớ rớ
3 Ava
3 Peter
4 Ava
4 Rớ rớ
5 Monish
6 Monish
7 Monish

Hoặc chúng tôi có thể xóa một trong các cột khỏi truy vấn thứ hai:

SELECT EmployeeName FROM Employees
UNION
SELECT CustomerName FROM Customers;

Kết quả:

EMPLOYEENAME
Ava
Bart
Tháng 1
Mia
Monish
Peter
Vớ vẩn

Hãy lưu ý rằng bạn có thể nhận được rất nhiều kết quả khác nhau tùy thuộc vào tùy chọn bạn sử dụng. Trên thực tế, chúng tôi đã nhận được các kết quả khác nhau trong ví dụ của chúng tôi ở trên.

Điều này là do UNION toán tử trả về các hàng riêng biệt trừ khi nó được nối với ALL từ khóa. Khi chúng tôi bao gồm các cột "ID", điều này làm cho một số hàng trở nên khác biệt khi chúng sẽ không có nếu chúng tôi chỉ trả lại các cột "tên". Sau đó, khi chúng tôi loại trừ các cột "ID", chúng tôi nhận được các giá trị duy nhất từ ​​các cột "tên".

Nếu bạn thực sự muốn các giá trị trùng lặp được trả về, bạn có thể sử dụng ALL từ khóa.

Do đó, chúng ta có thể sửa đổi ví dụ cuối cùng của mình như sau:

SELECT EmployeeName FROM Employees
UNION ALL
SELECT CustomerName FROM Customers;

Kết quả:

EMPLOYEENAME
Bart
Tháng 1
Ava
Vớ vẩn
Monish
Monish
Monish
Mia
Vớ vẩn
Peter
Ava
Monish
Monish

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL - Tính tổng và nhóm dữ liệu theo tuần

  2. Kết nối bằng Oracle SQL

  3. Làm cách nào để cài đặt oracle Instantclient và pdo_oci trên máy ubuntu?

  4. Lỗi rút phích cắm PDB ORA-17528

  5. Khi nào tôi nên lồng các khối PL / SQL BEGIN ... END?