2014-09-09 3 views
0

Если значение не существует в таблице B, замените значение с нуль-Oracle SQL: NVL Функция

Таблица A Сотрудники

ID,NAME 
1,Sam    
2,Jon 
3,Nick 

Таблица B Sallery

ID,Sallery 
1,500 
2,1000 

Прошлые результаты:

NAME,Sallery 
Sam,500 
Jon,1000 
Nick, 

То, что я получил до сих пор:

Select A.NAME, 
     NVL(Select Sum(B.Amount) from Sallery B where B.ID=A.ID ,null) 
From Employees A 

Я хочу, чтобы избежать использованияКонтактных в "случае, когда существует" выражение

Спасибо

+1

Вы говорите нам, что вы получили до сих пор, но забывают сказать нам ваши проблемы с ним :-) Как видно из ответа Патрик Хофман, он является левое внешнее соединение на самом деле вы ищете. Тем не менее, ваш подход будет работать, только вам понадобятся дополнительные круглые скобки вокруг вашего подзапроса, чтобы сделать его синтаксически правильным: 'NVL ((выберите Sum (B.Amount) из Sallery B, где B.ID = A.ID), нуль) '. –

ответ

2

Вы должны использовать left outer join для этого :

select a.name 
,  sum(b.amount) amount 
from employees a 
left 
outer 
join sallery b 
on  b.id = a.id 

sum вернет null, если нет строк в b.

+0

Спасибо, работает намного быстрее – MrM

+0

@ user3651825: Поскольку вы новичок, пожалуйста, не забудьте принять ответ, который вам больше всего понравился, когда на ваш вопрос был дан ответ. –

1
SELECT B.name, A.sal 
FROM (SELECT SUM(NVL(salary, 0)) sal, id 
    FROM salary 
    GROUP BY id)A, Employees B 
WHERE A.id=B.id 
+1

Просто замечание: вы больше не должны предлагать использовать старый синтаксис соединения, разделенный запятой, который был заменен явным синтаксисом соединения (INNER JOIN ... ON ...) более двадцати лет назад. –

+1

Внутренне оба одинаковые. – FMQB

+1

Да, конечно. Это вопрос читаемости и явных объединений, которые менее подвержены ошибкам. –

Смежные вопросы