Как правильно использовать таблицы SELF JOIN в oracle 11g?

Я хочу направить сотрудников к их руководителю.

У меня есть два примера здесь. Оба они дают мне решение, которое я не хочу.

Первый запрос на самостоятельное присоединение:

select m1.naam as medewerker, m2.naam as manager
from medewerkers m1, medewerkers m2
where m1.medewerker_id = m2.manager
order by 1;

Скрин решения:

введите здесь описание изображения

теперь я получаю только всех менеджеров, а не сотрудников

Второй запрос на самостоятельное присоединение:

select b.naam as employee, a.naam as manager
from medewerkers a right outer join medewerkers b on(a.medewerker_id = b.manager);

Скрин решения:

введите здесь описание изображения

Это приведет к тому же, что и выше, с дополнительными сотрудниками. Проблема в том, что сотрудники не ссылаются на своих менеджеров (менеджеры по-прежнему ссылаются на самих себя).

На данный момент это то, что я вставляю в свою БД. Возможно, может быть проблема с моим вставляемым значением. Потому что данные авансеры не будут работать

--Работник

insert into MEDEWERKERS (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager)
values(11111112, 'Joost', 'Eindhoven Langloopstraat 1', 0678765478, 1500, 'baliemedewerker', 10, null);
insert into MEDEWERKERS (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager)
values(11111119, 'Rick','Gemert. Dunneweg 76', 0678768315, 2200, 'Manager', 10, 11111119);

person Maxime de Lange    schedule 31.03.2015    source источник
comment
Вы должны отредактировать свой запрос и показать (1) результаты, которые вы действительно хотите, и (2) образцы данных, входящие в запрос.   -  person Gordon Linoff    schedule 31.03.2015
comment
Да, ваша вставка неверна. manager должно быть 11111119 в первой записи и null во второй.   -  person D Stanley    schedule 31.03.2015
comment
менеджером должен быть тот, у кого на конце цифры, а не нулевое значение. Я надеюсь, что я имею смысл. Теперь я вижу, что отсылаю менеджера к самому себе, но как еще я мог это исправить? Я нуб в этом :|   -  person Maxime de Lange    schedule 31.03.2015


Ответы (2)


Вы либо получили соединение задом наперед, либо тянете не с той стороны (в зависимости от того, как вы на это смотрите). Если вы используете разные псевдонимы таблиц, это становится более очевидным:

select emp.naam as medewerker, man.naam as manager
from medewerkers emp, medewerkers man
where emp.medewerker_id = man.manager   --asking for rows where the employee is the manager's manager!
order by 1;

измените порядок соединения (и используйте правильный синтаксис соединения):

select emp.naam as medewerker, man.naam as manager
from medewerkers emp
INNER JOIN medewerkers man
    ON emp.manager = man.medewerker_id 
order by 1;

Вот правильные утверждения, чтобы исправить ваши неверные входные данные:

insert into MEDEWERKERS 
    (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager)
values
    (11111112, 'Joost', 'Eindhoven Langloopstraat 1', 0678765478, 1500, 'baliemedewerker', 10, 11111119);

insert into MEDEWERKERS 
   (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager)
values
    (11111119, 'Rick','Gemert. Dunneweg 76', 0678768315, 2200, 'Manager', 10, null);
person D Stanley    schedule 31.03.2015
comment
Все решения не будут работать. Я думаю, что это мое вставляемое значение неверно. Не могли бы вы взглянуть на это? я обновил свой вопрос - person Maxime de Lange; 31.03.2015
comment
Да, похоже, что ваша вставка неверна - вы не назначаете менеджера сотруднику (Джост), а менеджер (Рик) назначается самому себе. - person D Stanley; 31.03.2015
comment
Я вижу, что вы говорите. Теперь я понял, спасибо за это. Есть идеи, как это исправить? я должен дать этому менеджеру другой номер или что я должен сделать? - person Maxime de Lange; 31.03.2015
comment
@MaximedeLange Мусор на входе, мусор на выходе - исправьте исходные данные. manager должно быть 11111119 в первой записи и null во второй. - person D Stanley; 31.03.2015
comment
Извините, что спрашиваю. Я немного медлительный сегодня. Не могли бы вы привести пример того, как правильно реализовать оператор вставки? Потому что я понимаю, о чем вы говорите, но я не могу это как-то реализовать :S. извините, что спрашиваю - person Maxime de Lange; 31.03.2015
comment
@MaximedeLange Я добавил в свой ответ правильные операторы вставки, чтобы они были лучше отформатированы. - person D Stanley; 31.03.2015
comment
Спасибо за помощь. Я отметил ваше решение как лучшее! - person Maxime de Lange; 31.03.2015

Проблема в строке Rick/Rick и так далее? Если это так, вы можете заменить имя менеджера на NULL, исправив предложение on:

select e.naam as medewerker, m.naam as manager
from medewerkers e left join
     medewerkers m
     on m.medewerker_id = e.manager and
        m.medewerker_id <> e.medewerker_id
order by 1;

Или, поскольку проблема может заключаться в дублировании исходной таблицы, вам может понадобиться:

select e.naam as medewerker, m.naam as manager
from medewerkers e left join
     medewerkers m
     on m.medewerker_id = e.manager
where e.medewerker_id <> e.manager     
order by 1;
person Gordon Linoff    schedule 31.03.2015
comment
--MEDEWERKERS вставить в MEDEWERKERS (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager) значения (11111112, 'Joost', 'Eindhoven Langloopstraat 1', 0678765478, 1500, 'baliemedewerker', 10, null); вставить в MEDEWERKERS (medewerker_id, naam, adres, telefoon_nummer, salaris, functie, werknemer_winkel_nummer, manager) значения (11111119, 'Rick', 'Gemert. Dunneweg 76', 0678768315, 2200, 'Manager', 10, 11111119); - person Maxime de Lange; 31.03.2015
comment
Извини, приятель, я нажал не ту кнопку. Я просто хотел обновить свой пост :). во всяком случае, это мое вставляемое значение, я думаю, что здесь кроется проблема. вместо ваших решений - person Maxime de Lange; 31.03.2015