#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 Вы уже выполняли подразумеваемое объединение. Хитрость в том, что вы дважды присоединяетесь к одной и той же таблице.