Oracle select query с внутренней ошибкой выбора запроса

Я получаю ошибку SQL и пытаюсь решить, любые указатели были бы полезны,

// это выполняется

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

// это выполняется

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

но приведенный ниже запрос выдает ошибку:

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

ошибка: ORA-00907: отсутствует правая скобка 00907. 00000 - "отсутствует правая скобка"

обновление: 07/14:

обновление с точным решением от @dasblinkenlight:

проблема заключается в размещении заказа в подзапросе предложения WHERE. язык SQL синтаксис не позволяет упорядочивать элементы подзапроса в Предложение WHERE, поскольку оно не изменяет результат запроса в целом

эта статья хорошо объясняет многие понятия - http://oraclequirks.blogspot.com/2008/01/ora-00907-missing-right-parenthesis.html

" ORA-00907: отсутствует справа скобки ясно, когда один получает сообщение как это, первая реакция, вероятно, проверить, какие скобки был опущен, но, к сожалению, нет отсутствующих скобок вообще в этом заявлении.

чтобы сократить его, Нерассказанная синтаксическая причуда суммируется следующим образом: не используйте ORDER BY внутри подзапроса IN.

теперь можно возразить, что действительно нет смысла использовать порядок По внутри предложения IN, что верно, потому что Oracle не волнует о порядке строк внутри предложения IN:"

я попробовал оператор SQL с предложением WHERE и " = "вместо " IN", и он все еще бросил ошибку:"missing right parenthesis'.

вывод 1 :

" не используйте ORDER BY в подзапросе предложения WHERE" или "подзапросы в предложении where не могут использовать ORDER BY в Oracle"

вывод 2

этот пример-исследование также показывает сценарий куда мы должны пойти для JOIN, а не выбирать подзапрос

2 ответов


проблема заключается в размещении ORDER BY на WHERE п. подзапрос. Синтаксис SQL не позволяет упорядочивать элементы подзапроса в WHERE предложение, потому что оно не изменяет результат запроса в целом.

вы должны переместить его исправить синтаксис:

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

createddate не является столбцом в employees таблица. Она существует только в department стол

тогда вам нужно присоединиться к department таблица, и использовать ORDER BY on одна из его колонок:

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

очевидно, вам не нужно order by в вашем подзапросе, и вы можете удалить его, а затем скобки будут в порядке

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

Если вы хотите применить order by вам придется сделать это на вашем внешнем запросе