Использование внешнего запроса во внутреннем запросе - PullRequest
1 голос
/ 05 апреля 2020

Я не понимаю, в чем здесь ошибка, почему она не работает (Oracle DB)

https://www.hackerrank.com/challenges/binary-search-tree-1/problem?isFullScreen=true

Это вопрос hackerrank

SELECT N, 
(case
 when P IS NULL then 'Root'
 else
    when (SELECT COUNT(*) FROM BST WHERE P=B.N) > 0 then 'Inner'
    else 'Leaf'
    end
 end ))
 FROM BST AS B ORDER BY N;

Сначала я подумал, что внешний запрос используется во внутреннем запросе, поэтому он не будет работать. Но если он работает для MySQL, то он должен работать и для Oracle.

Этот код ниже для MySQL, и он работал

SELECT N, IF(P IS NULL,'Root',IF((SELECT COUNT(*) 
FROM BST WHERE P=B.N)>0,'Inner','Leaf')) 
FROM BST AS B ORDER BY N;

1 Ответ

2 голосов
/ 05 апреля 2020

Oracle не поддерживает as для псевдонимов таблиц. Тем не менее, я бы рекомендовал написать это как:

select b.N, 
       (case when b.P IS NULL
             then 'Root'
             when exists (select 1 from bst b2 where b2.p = b.n) 
             then 'Inner'
             else 'Leaf'
        end)
from BST B
order by N;

Это стандарт SQL и должен работать как Oracle, так и MySQL.

Примечания:

  • CASE выражения не должны быть вложенными. Они могут иметь несколько предложений WHEN.
  • В запросе с несколькими ссылками на таблицы квалифицировать все ссылки на столбцы.
  • exists быстрее, чем count(*), поскольку он может остановиться при первом совпадении.
  • Псевдоним таблиц через ключевое слово AS недопустим в Oracle DB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...