Oracle ошибка базы данных 907: ORA-00907: отсутствует правая скобка - PullRequest
0 голосов
/ 20 января 2020

Я передал этот код напрямую от SQL разработчика. Там прекрасно работает.

SELECT 
    a.INCIDENT_NUMBER,
    a.DETAILED_DESCRIPTION,    
    a.INCIDENT_ROOT_CAUSE

FROM 
    N_EVALUATION as a

INNER JOIN N_DISPOSITION as b
    ON (a.INCIDENT_NUMBER = b.INCIDENT_NUMBER) 

WHERE
    b.DISPOSITION_LINE_NUM in (NULL, 1) AND
    a.ACTIVE_FLAG = 'Y' AND
    b.ACTIVE_FLAG = 'Y' AND
    a.DETAILED_DESCRIPTION IS NOT NULL

Однако, когда я передаю тот же самый точный код в Tableau, чтобы создать пользовательский запрос SQL. Это дает мне ошибку;

Произошла ошибка при обмене данными с источником данных. Плохое соединение: Tableau не может подключиться к источнику данных. Oracle ошибка базы данных 907: ORA-00907: отсутствует правильная круглая скобка

Это меня совершенно озадачило, я не совсем уверен, что здесь делать. Любая помощь или совет высоко ценится. Меня больше беспокоит отсутствие правильных скобок, а не плохая связь.

1 Ответ

1 голос
/ 20 января 2020

Удалите AS из предложения FROM. Oracle не распознает это.

Кроме того, это условие:

 b.DISPOSITION_LINE_NUM in (NULL, 1)

Не выполняет то, что вы ожидаете. Значение b.DISPOSITION_LINE_NUM не равно NULL.

. Вы должны заменить его на:

 (b.DISPOSITION_LINE_NUM IS NULL OR b.DISPOSITION_LINE_NUM = 1)

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

SELECT e.INCIDENT_NUMBER, e.DETAILED_DESCRIPTION, e.INCIDENT_ROOT_CAUSE
FROM N_EVALUATION e JOIN
     N_DISPOSITION d
     ON e.INCIDENT_NUMBER = d.INCIDENT_NUMBER
WHERE (d.DISPOSITION_LINE_NUM IS NULL OR d.DISPOSITION_LINE_NUM = 1) AND
      e.ACTIVE_FLAG = 'Y' AND
      d.ACTIVE_FLAG = 'Y' AND
      e.DETAILED_DESCRIPTION IS NOT NULL;

Примечания:

  • Значимые пользователем псевдонимы таблиц, а не произвольные буквы (здесь используются сокращения).
  • Не использовать as в FROM предложение.
  • Будьте осторожны с NULL сравнениями.

Наконец, ваш исходный запрос эквивалентен:

SELECT e.INCIDENT_NUMBER, e.DETAILED_DESCRIPTION, e.INCIDENT_ROOT_CAUSE
FROM N_EVALUATION e JOIN
     N_DISPOSITION d
     ON e.INCIDENT_NUMBER = d.INCIDENT_NUMBER
WHERE d.DISPOSITION_LINE_NUM = 1 AND
      e.ACTIVE_FLAG = 'Y' AND
      d.ACTIVE_FLAG = 'Y' AND
      e.DETAILED_DESCRIPTION IS NOT NULL;

Здесь нет скобок. Так что не может вернуть эту конкретную ошибку.

...