#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. Я отредактировал ответ и добавил еще немного кода. Если это все еще не работает, пожалуйста, отредактируйте свой собственный вопрос и опубликуйте примеры данных (несколько строк, иллюстрирующих проблему) и желаемый результат; тогда я посмотрю.