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 |