SQL-запрос для поиска строк, которые имеют только одну строку (для лицензии EX) - PullRequest
0 голосов
/ 04 октября 2018

У меня есть запрос, извлекающий данные из нескольких таблиц, включая одну с именем empl_access.Мне нужны только активные сотрудники, у которых только s_system_cd тип WEC.

В этом поле есть два значения: WEC и WTC.У сотрудников может быть и то и другое, но я хочу, чтобы у сотрудников был только один, WEC.

Вот мой сценарий.Это вытягивает все WEC строки, но некоторые из них также имеют WTC, и я хочу, чтобы они были отфильтрованы.

select DISTINCT a.empl_id, a.last_name, a.first_name, a.active_fl,    
   b.UDT09_ABBRV_ID, c.s_system_cd, count(a.empl_id) over ()
from empl a, V_TBE_MAX_EMPL_HISTORY b, empl_access c 
where a.empl_id=b.empl_id 
   and a.empl_id=c.empl_id
   and a.active_fl='Y'
   and c.s_system_cd like 'WEC%'
order by a.empl_id;

Это пример того, что находится в таблице:

empl_id    | last_name      | first_name     | udt09_abbr_id       | s_system_cd
-----------|----------------|----------------|---------------------|-----------------
000000     | Mouse          | Mickey         | 1111                | WEC
-----------|----------------|----------------|---------------------|-----------------
000000     | Mouse          | Mickey         | 1111                | WTC
-----------|----------------|----------------|---------------------|-----------------
000010     | Duck           | Donald         | 1111                | WEC
-----------|----------------|----------------|---------------------|-----------------
000010     | Duck           | Donald         | 1111                | WTC
-----------|----------------|----------------|---------------------|-----------------
000020     | Parker         | John           | 1150                | WEC
-----------|----------------|----------------|---------------------|-----------------
000030     | Smith          | Anne           | 1152                | WEC

Это то, что я хочу потянуть

-----------|----------------|----------------|---------------------|-----------------
empl_id    | last_name      | first_name     | udt09_abbr_id       | s_system_cd
-----------|----------------|----------------|---------------------|-----------------
000020     | Parker         | John           | 1150                | WEC
-----------|----------------|----------------|---------------------|-----------------
000030     | Smith          | Anne           | 1152                | WEC
-----------|----------------|----------------|---------------------|-----------------

Ответы [ 2 ]

0 голосов
/ 05 октября 2018
SELECT DISTINCT a.empl_id, a.last_name, a.first_name, a.active_fl,    
   b.UDT09_ABBRV_ID, c.s_system_cd, count(a.empl_id) over ()
FROM empl a
INNER JOIN V_TBE_MAX_EMPL_HISTORY b ON a.empl_id=b.empl_id 
INNER JOIN empl_access c ON a.empl_id=c.empl_id AND c.s_system_cd like 'WEC%'
LEFT JOIN empl_access c2 ON a.empl_id=c2.empl_id AND c2.s_system_cd like 'WTC%'
WHERE a.active_fl='Y' AND c2.empl_id IS NULL
ORDER BY a.empl_id;

Вы также можете сделать это с помощью операции EXISTS или GROUP BY и некоторых хитростей с помощью агрегатных функций (min = max в другом ответе работает; так же как и проверка count = 1 иmax = 'WEC').

Пример ответа на этот вопрос - как вам всегда * писать свои объединения.

empl a, V_TBE_MAX_EMPL_HISTORY b, empl_access cвещи для птиц.Труднее читать и управлять, когда вы добавляете больше таблиц или условий, есть некоторые вещи, которые старый синтаксис просто не может сделать, и старый синтаксис считается устаревшим вот уже примерно 20 лет.


* Я не использую Oracle так часто, но я понимаю, что есть очень редкая ситуация, в которой может потребоваться более старый синтаксис.Но за пределами этого (и вы узнаете, если найдете его), придерживайтесь записи INNER, LEFT, CROSS, FULL, LATERAL и т. Д.

0 голосов
/ 04 октября 2018

Хотелось бы что-нибудь подобное?

SQL> with test (empl_id, s_system_cd) as
  2    (select 1, 'WEC' from dual union all  -- EMPL_ID = 1 has both - we don't want it
  3     select 1, 'WTC' from dual union all
  4     select 2, 'WTC' from dual union all  -- EMPL_ID = 2 has only WTC - we don't want it
  5     select 3, 'WEC' from dual union all  -- EMPL_ID = 3 has only WEC - we do want it
  6     select 4, 'WEC' from dual union all  -- EMPL_ID = 4 has WEC, twice - we do want it
  7     select 4, 'WEC' from dual
  8    )
  9  select empl_id
 10  from test
 11  group by empl_id
 12  having min(s_system_cd) = max(s_system_cd)
 13     and min(s_system_cd) = 'WEC'
 14  order by empl_id;

   EMPL_ID
----------
         3
         4

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...