Остальные ответы верны, и если столбец id
уникален, я определенно так и сделаю.
Однако, чтобы объяснить, как делать то, что вы хотите, используя скалярный подзапрос,сначала нужно выполнить скалярный подзапрос, а затем решить, что делать с результатами, чтобы он выглядел примерно так:
select id,
case when rank is null then 0 else rank end rank1,
coalesce (rank, 0) rank2,
nvl (rank, 0) rank3
from (select tab1.id,
(select tab2.rank from table2 tab2 where tab2.id = tab1.id) rank
from table1 tab1);
Примечание: я дал вам 3 способа получения ранга, который выпосле:
CASE
- это нормально для использования, но немного многословно. COALESCE
- возвращает первое ненулевое значение в списке предоставленных параметров NVL
- это нормально использовать в этой ситуации, поскольку второе значение является константой.Однако NVL
всегда оценивает оба параметра, независимо от того, нужен он или нет.Если второй параметр является функцией, он будет запускаться каждый раз, даже если первый параметр не равен нулю.И CASE
, и COALESCE
будут выполнять логическое короткое замыкание, то есть они остановятся при первом условии, которое оценивается как истинное.
В общем, мой предпочтительный вариант - использовать COALESCE
.