2014-07-14 17 views
6

Tôi nhận được một lỗi SQL và cố gắng giải quyết, bất kỳ con trỏ sẽ là hữu ích,Oracle chọn truy vấn với lỗi bên trong chọn truy vấn

// này được thực hiện

SELECT empid FROM employees WHERE deptid IN (10,20,30,40);

// này được thực hiện

SELECT deptid FROM department WHERE description LIKE '%application%' 
    ORDER BY createddate DESC 

nhưng truy vấn dưới đây ném lỗi:

SELECT empid FROM employees WHERE deptid IN (SELECT deptid FROM department WHERE description LIKE '%application%' 
    ORDER BY createddate DESC); 

lỗi: ORA-00907: thiếu ngoặc đúng 00907. 00000 - "ngoặc đúng mất tích"

Cập nhật: 14/07:

Đang cập nhật với các giải pháp chính xác từ @dasblinkenlight:

The problem is placing ORDER BY in the WHERE clause subquery. SQL syntax does not allow you to order elements of the subquery in the WHERE clause, because it does not change the result of the query overall

bài viết này cũng giải thích nhiều khái niệm - http://oraclequirks.blogspot.com/2008/01/ora-00907-missing-right-parenthesis.html

"ORA-00907: missing right parenthesis Clearly when one gets a message like this, the first reaction is probably to verify what parenthesis has been left out, but unfortunately there are no missing parentheses at all in this statement.

To cut it short, the untold syntax quirk is summarized as follows: don't use ORDER BY inside an IN subquery.

Now, one may object that indeed it doesn't make sense to use the ORDER BY inside an IN clause, which is true, because Oracle doesn't care about the row order inside an IN clause:"

Tôi đã thử câu lệnh SQL với mệnh đề WHERE và '=' thay vì 'IN' và nó vẫn ném lỗi: 'missing right parenthesis'.

kết luận 1:

"Không sử dụng ORDER BY trong mệnh đề WHERE subquery" hay "truy vấn phụ trong mệnh đề where không được phép sử dụng ORDER BY trong Oracle"

Kết luận 2

trường nghiên cứu này cũng cho thấy kịch bản mà chúng ta nên đi cho THAM GIA hơn là chọn subquery

+2

mất xem bài viết này: http: //oraclequirks.blogspot.com/2008/01/ora-00907-missing-right-parenthesis.html –

+0

wow, bài viết rất hay, thông tin bổ sung, Cảm ơn bạn rất nhiều @beherenow – spiderman

+0

kết luận của bạn 1 không hoàn toàn chính xác. các truy vấn con trong mệnh đề where ĐƯỢC cho phép sử dụng thứ tự theo, NHƯNG chỉ trong trường hợp thứ tự ảnh hưởng đến tập kết quả - ví dụ, nơi nó cung cấp lọc đầu, như trong http://sqlfiddle.com/#!4/d41d8 . trong trường hợp khác nó ném ora-907. bạn cũng có thể muốn xem MOS bài viết 731577.1, mà tôi vừa tìm thấy - chúng dường như có rất nhiều SR về điều này để họ làm rõ điều này) –

Trả lời

4

Sự cố đang đặt ORDER BY trong truy vấn con khoản WHERE. Cú pháp SQL không cho phép bạn đặt hàng các phần tử của truy vấn con trong mệnh đề WHERE, bởi vì nó không thay đổi kết quả của truy vấn tổng thể.

Bạn nên di chuyển nó ra để sửa chữa cú pháp:

SELECT empid FROM employees WHERE deptid IN 
    (
     SELECT deptid FROM department WHERE description LIKE '%application%' 
    ) 
ORDER BY createddate DESC 

createddate is not a column in employees table. It exists only in department table

Sau đó, bạn cần phải tham gia vào bảng department, và sử dụng ORDER BY trên một trong các cột của nó:

SELECT e.empid 
FROM employees e 
JOIN department d ON e.deptid = d.deptid 
WHERE d.description LIKE '%application%' 
ORDER BY d.createddate DESC 
+1

Cảm ơn bạn đã giải thích nguyên nhân gốc rễ. Nhưng di chuyển nó ra là không chính xác như 'createddate' không phải là một cột trong bảng' employee'. Nó chỉ tồn tại trong bảng 'department'. Tôi vẫn cố gắng và đã nhận được lỗi dự kiến ​​là 'số nhận dạng không hợp lệ' – spiderman

+0

@prash Bạn có muốn đặt hàng nhân viên vào ngày tạo của bộ phận đó không? – dasblinkenlight

+0

@prash Tất nhiên, bạn không thể sử dụng số nhận dạng từ truy vấn con trên truy vấn bên ngoài. LAs tôi đã nói, đặt hàng truy vấn phụ của bạn sẽ không mua cho bạn bất cứ điều gì anyway –

1

Rõ ràng, bạn không cần phải order by trong subquery của bạn và bạn có thể xóa nó và sau đó ngoặc sẽ vừa phải

SELECT empid 
FROM employees 
WHERE deptid IN (SELECT deptid 
       FROM department 
       WHERE description LIKE '%application%'); 

Nếu bạn muốn áp dụng order by bạn sẽ phải làm điều đó trên truy vấn bên ngoài của bạn

+0

Cảm ơn bạn đã trả lời và nhận xét, +1. Nhưng vì điều này không giải quyết làm thế nào để đặt hàng bằng, tôi chấp nhận khác như câu trả lời hoàn chỉnh của tôi. Cảm ơn bạn, mặc dù – spiderman

+0

@prash Không vấn đề gì, tôi cũng chỉ tập trung vào "tại sao truy vấn của bạn không hoạt động" và không làm bất cứ điều gì để giải quyết vấn đề nói chung. Và tôi đã đưa +1 cho 'dasblinkenlight' để suy nghĩ thêm –

Các vấn đề liên quan