SQL-запрос (требуется самостоятельное объединение?) - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть таблица с несколькими полями и двумя полями идентификатора, одно поле называется регулярный_идентификатор, а второе - специальным.

Каждая строка может иметь значение в регулярных_иде и специальном_иде, если в специальном_иде есть значение, оно существует где-то еще в таблице как регулярный_идентификатор.

Я хочу создать запрос, который говорит -

Дайте мне все строки, где поле special_id равно нулю, но значение в поле normal_id больше нигде не существует (в любой другой строке /запись) в этой таблице под специальным полем.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Подзапрос или существует может сделать.

Это очень похоже на известную таблицу scott.EMP в Oracle.

create table emp(  
  empno    number(4,0),  
  ename    varchar2(10),  
  job      varchar2(9),  
  mgr      number(4,0),  
  hiredate date,  
  sal      number(7,2),  
  comm     number(7,2),  
  deptno   number(2,0),  
  constraint pk_emp primary key (empno),  
  constraint fk_deptno foreign key (deptno) references dept (deptno)  
)

Таким образом, normal_id в вашем вопросе - это empno (идентификатор сотрудника) в таблице scott.EMP, а special_id - этоmgr (идентификатор менеджера)

Теперь ваш вопрос переводится как scott.EMP: где поле mgr равно нулю, но значение в поле empno больше нигде не существует (в любой другой строке / записи) в этой таблице подполе mgr.

select m.*
from scott.EMP m
where m.mgr IS NULL
and m.empno not in (select mgr from scott.EMP where mgr is not null)

спасибо за исправление Торстена Кеттнера, всегда обращайте внимание на NULL в списке

Ваш вопрос переводится на естественный язык: The person who has no manager and is not manager of any employee.

0 голосов
/ 13 февраля 2019

Самостоятельное соединение - верный путь.

SELECT a.special_id, a.regular_id
FROM tablename  a
LEFT JOIN tablename b
    ON a.regular_id = b.special_id 
WHERE a.special_id IS NULL
AND b.special_id IS NULL;

Примечание. Замените имя таблицы фактическим именем таблицы.

Пример данных:

REGULAR_ID  SPECIAL_ID
1           1
1           2
2           1
3           1
1           NULL
3           NULL

Результат:

REGULAR_ID  SPECIAL_ID
3           NULL
0 голосов
/ 13 февраля 2019

ПРИМЕЧАНИЕ: не проверено.

select A.*
from table A
where A.special_id is null
and not exists (select 1 from table B where B.special_id = A.regular_id)

Конечно, A и B являются псевдонимами для одной и той же таблицы базы данных.

...