SQL-запрос для проверки отсутствия значения

#sql #oracle

#sql #Oracle

Вопрос:

Во-первых, я действительно не знаю, как сформулировать свой вопрос.

У меня есть разные компании в базе данных.

Я хотел бы знать, в каких компаниях нет профиля «аналитик».

Вот мой вопрос:

 select t.name as "name" t.pre as "first name" t.id as "# account" t.profile as "Profile" b.cod_miss as "Mission" b.df_missn as "End date"   from sr.v t  inner join od.e_lds on t.niu_ld = b.niu_ld where b.cod_miss = 'APPROV' and t.profile = 'Analyst'  

Этот запрос дает мне всю аналитику для каждой компании в моей базе данных. Но я хотел бы иметь все компании, в которых нет ни одного аналитика. как мне это сделать? Я попытался использовать «и т. д. профиль lt; gt; «аналитик»», но, очевидно, это плохо работает…

Редактировать:

Я попробовал принятый ответ, но заметил, что он просто возвращает мне всех, кто НЕ является аналитиком.

Допустим, существует компания X с 3 сотрудниками. Один из них-аналитик. Я бы не хотел, чтобы эта компания фигурировала в моих результатах. но если есть компания Y с 2 сотрудниками, и ни один из них не является «аналитиком», то я бы хотел, чтобы в результате появилась эта компания.

Ответ №1:

Если бы я вас правильно понял, это было бы так not exists . Что — то вроде этого:

 select * from sr.v  where not exists (select null   from od.e_lds b  where b.niu_ld = t.niu_ld  and t.profile = 'Analyst'  );  

Применяется к вашему запросу:

 select  t.name as "name"  t.pre as "first name"  t.id as "# account"  t.profile as "Profile"  b.cod_miss as "Mission"  b.df_missn as "End date" from sr.v t inner join od.e_lds b on t.niu_ld = b.niu_ld where b.cod_miss = 'APPROV'  --  and not exists (select null   from od.e_lds c  where c.niu_ld = t.niu_ld  and t.profile = 'Analyst'  );  

[ПРАВКА №2, с некоторыми образцами данных]

Это пример, который показывает, что вы пытались объяснить словами (хотя было бы лучше, если бы вы опубликовали примеры данных). Как вы можете видеть, один из сотрудников BMW является аналитиком, в то время как никто в SAP не является gt;gt;gt; поэтому SAP возвращается.

 SQLgt; with test (company, ename, profile) as  2 (select 'BMW', 'Scott', 'Analyst' from dual union all  3 select 'BMW', 'King' , 'Manager' from dual union all  4 select 'BMW', 'Mike' , 'Clerk' from dual union all  5 --  6 select 'SAP', 'John' , 'Clerk' from dual union all  7 select 'SAP', 'Fred' , 'Manager' from dual  8 )  9 select a.company, a.ename, a.profile  10 from test a  11 where not exists (select null  12 from test b  13 where b.company = a.company  14 and b.profile = 'Analyst');  COMPANY ENAME PROFILE ---------- ----- ------- SAP Fred Manager SAP John Clerk  SQLgt;  

Комментарии:

1. спасибо за ваш ответ, но почему вы удалили внутреннее соединение?

2. Для простоты. Вы знаете, как его использовать; вы не знали, как выполнить часть » НЕ СУЩЕСТВУЕТ «, которая здесь является «ключом».

3. могу ли я присоединиться к таблицам перед предложением «где не существует»?

4. извините, что беспокою вас, но я не уверен, как это сделать. У меня есть ценности, которые необходимо соблюдать, и я не знаю, куда их девать. Не могли бы вы, пожалуйста, отредактировать свой ответ, чтобы он точно соответствовал моему исходному запросу с предложением «где не существует»? Я так заблудился и весь последний час слонялся без дела…

5. Я отредактировал ответ и добавил еще немного кода. Если это все еще не работает, пожалуйста, отредактируйте свой собственный вопрос и опубликуйте примеры данных (несколько строк, иллюстрирующих проблему) и желаемый результат; тогда я посмотрю.