Создать представление с двумя внешними ключами из одной таблицы

#sql #sql-server #join #create-table #create-view

#sql #sql-сервер #Присоединиться #создать-таблица #создать-просмотр

Вопрос:

Я все еще новичок, когда дело доходит до SQL и SQL Server, поэтому, пожалуйста, ответьте на этот вопрос. Я работаю над проектом, который похож на простую гипотетическую ситуацию, которую я создал ниже. У меня есть две таблицы, из которых я пытаюсь создать представление:

 CREATE TABLE Emp (
Emp_ID int IDENTITY(101,1) NOT NULL,
Emp_Name VARCHAR(10) NULL,
Emp_Boss int NULL,
PRIMARY KEY (Emp_ID),
CONSTRAINT fk_emp_boss FOREIGN KEY (Emp_Boss) REFERENCES Emp(Emp_ID));

CREATE TABLE Dept (
Dept_ID tinyint IDENTITY(101,1) NOT NULL,
Dept_Name VARCHAR(10) NULL,
Dept_Boss int NULL,
Dept_Emp int NULL,
PRIMARY KEY (Dept_Id),
CONSTRAINT fk_boss FOREIGN KEY (Dept_Boss) REFERENCES Emp(Emp_ID),
CONSTRAINT fk_emp FOREIGN KEY (Dept_Emp) REFERENCES Emp(Emp_ID));
INSERT INTO Emp (Emp_Name, Emp_Boss)
VALUES ('Marshal', 101), ('Lilly', 101), ('Robin', 101), ('Barney', 104), ('Ted', 104), ('Tracy', 104);
INSERT INTO Dept (Dept_Name, Dept_Boss, Dept_Emp)
VALUES ('Math',101,101), ('Math',101,102), ('Math',101,103), ('Physics',104,104),('Physics',104,105), ('Physics',104,106);
  

Пока у меня есть этот оператор Create:

 CREATE VIEW Tests AS
SELECT Dept_Name, Emp_Name AS Dept_Boss, Emp_Name 
FROM Dept, Emp 
WHERE Dept_Boss = Emp_ID AND 
Dept_Emp = Emp_ID;
  

Но этот оператор создает представление только с двумя строками, которые являются двумя боссами.

И я хочу что-то вроде этого:

 Dept_Name | Dept_Emp | Dept_Boss
Math            | Marshal     | Marshal
Math            | Lilly           | Marshal
Math            | Tracy         | Marshal
Physics        | Barney      | Barney
Physics        | Robin        | Barney
Physics        | Ted           | Barney
  

Есть ли способ сделать это? Я знаю, почему созданное ПРЕДСТАВЛЕНИЕ, которое я написал, возвращает только две строки. Это потому, что только эти две строки удовлетворяют обоим условиям в предложении WHERE . Я пытался использовать ИЛИ вместо И, но это возвращает слишком много строк, а a на самом деле не соответствует боссу с emp. Буду признателен за любую помощь, которую я могу получить по этому вопросу!

Комментарии:

1. в вашем запросе запрашиваются те сотрудники, которые, по сути, являются их собственными боссами. например, Marshal / 101 и Physics / 104 — единственные две записи, в которых удовлетворено ваше условие.

2. Я знаю это, и именно поэтому мой вопрос заключался в том, как изменить запрос, чтобы он не запрашивал тех сотрудников, которые являются их собственным боссом. Кстати, спасибо за изменения в вопросе.

Ответ №1:

Вам придется присоединиться к вашей таблице EMP два раза для разных условий

 Alter VIEW Tests AS
SELECT Dept_Name, EMP1.Emp_Name, EMP2.Emp_Name AS Dept_Boss 
FROM Dept
JOIN EMP EMP1 on Dept_Emp = EMP1.Emp_ID 
JOIN EMP EMP2 on Dept_Boss = EMP2.Emp_ID 
  

Комментарии:

1. Не могу поверить, что я совсем забыл, что могу использовать JOIN. Спасибо за ответ! Это решение сработало отлично.

2. @user3694592 Вы уже выполняли подразумеваемое объединение. Хитрость в том, что вы дважды присоединяетесь к одной и той же таблице.