та же таблица, от 1 поля до 2 полей запроса - PullRequest
0 голосов
/ 04 апреля 2010

У меня есть 2 таблицы: первая содержит сотрудников (из них на любой должности), а вторая содержит отношения менеджера с сотрудниками с идентификационными номерами.

Я хочу написать запрос как

1st field: name(employee), 
2nd field: name(manager)

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2010

Нет необходимости во вложенных запросах, просто используйте стандартные объединения:

select e.*, m.*
from
  employee e
    left join employee_managers em
      on e.id = em.emp_id
    left join employee m
      on m.id = em.man_id

Каждая строка будет содержать все поля employee (возможно, несколько строк для одного сотрудника, если у него есть несколько связанных менеджеров) и все поля его соответствующего менеджера (или NULL s, если у сотрудника нет менеджера).

1 голос
/ 04 апреля 2010

Вы можете сделать это с одной таблицей:

 Employee
 --------
 EmployeeId int
 Name varchar(50)
 ManagerId int

ManagerId указывает на запись менеджера в той же таблице. Генеральный директор будет иметь идентификатор менеджера null. Пример определения таблицы:

create table Employees (
  EmployeeId int auto_increment primary key
, Name varchar(50)
, ManagerId int
, foreign key (ManagerId) references Employees(EmployeeId)
);

С некоторыми примерами данных:

insert into Employees (Name) select 'The Chief';
insert into Employees (Name, ManagerId) select 'Grunt 1', 
    (select EmployeeId from Employees where Name = 'The Chief');
insert into Employees (Name, ManagerId) select 'Grunt 2', 
    (select EmployeeId from Employees where Name = 'The Chief');
insert into Employees (Name, ManagerId) select 'Secretary', 
    (select EmployeeId from Employees where Name = 'The Chief');

Чтобы узнать имя менеджера второго Гранта, вы можете сделать запрос вроде:

select mgr.Name
from Employees mgr
inner join Employees grunt
on grunt.managerid = mgr.employeeid
where grunt.name = 'Grunt 2';
...