SQL JOIN и WHERE оператор - PullRequest
       11

SQL JOIN и WHERE оператор

0 голосов
/ 01 октября 2009

У меня проблема с тем, чтобы заставить этих sql государственных деятелей вернуть желаемое Я хочу, чтобы он возвращал список свойств сотрудника или Job_Profile. Если у одного из них нет свойства, он должен возвратить NULL в этой строке / столбце Теперь sql выглядит так:

SELECT Parameter.Patameter_Description ParamName, 
       Job_Profile.Title, Job_Property.Mark JobMark, 
       Emp_Property.Mark EmpMark, 
       Emp_Id--, (Employee.First_Name + ' ' + Employee.Last_Name) EmpName
FROM Job_Property
INNER JOIN  Job_Profile ON Job_Profile.Title = Job_Property.Job_Title
INNER JOIN Parameter ON Job_Property.Parameter_Id = Parameter.Id
RIGHT JOIN Emp_Property ON Emp_Property.Parameter_Id = Job_Property.Parameter_Id
INNER JOIN Employee ON Emp_Property.Emp_Id = Employee.Enterprise_Staff_Id

WHERE Employee.Enterprise_Staff_Id = 22 
AND Job_Profile.Title = 
    (SELECT 
       Employee.Job_Profile_Name 
       FROM Employee WHERE Employee.Enterprise_Staff_Id = 22)

Результат:

Analyse test    1   3   22

И мне бы хотелось, чтобы это было примерно так:

Analyse     test     1      3       22

Data        test     3      NULL    NULL or 22

economic    test     4      NULL    NULL or 22

Service     test     2      NULL    NULL or 22

Я знаю, что есть проблема, когда я: - присоединиться к Emp_Property - Сделайте WHERE заявление

Ответы [ 3 ]

3 голосов
/ 01 октября 2009

Попробуйте LEFT OUTER JOIN при присоединении к Emp_Property

1 голос
/ 01 октября 2009

Я нашел решение, мне пришлось создать временные таблицы и соединить их:

CREATE TABLE #CompareJob
(Parameter_Id INT
,Parameter_Name VARCHAR(MAX)
,Jobprofile VARCHAR(30)
,Job_Mark INT
)
INSERT INTO #CompareJob(Parameter_Id,Parameter_Name, Jobprofile ,Job_Mark)
    SELECT  Parameter.Id, Parameter.Patameter_Description, Job_Profile.Title, Job_Property.Mark
    FROM Job_Property
    INNER JOIN  Job_Profile ON Job_Profile.Title = Job_Property.Job_Title
    INNER JOIN Parameter ON Job_Property.Parameter_Id = Parameter.Id
    WHERE Job_Profile.Title = (SELECT Employee.Job_Profile_Name FROM Employee WHERE Employee.Enterprise_Staff_Id = 22)

CREATE TABLE #CompareEmp
(Parameter_Id INT
,Parameter_Name VARCHAR(MAX)
,Emp_Id INT
,Emp_Name VARCHAR(100)
,Emp_Mark INT
)
INSERT INTO #CompareEmp(Parameter_Id,Parameter_Name, Emp_Id , Emp_Name ,Emp_Mark)
    SELECT  Parameter.Id, Parameter.Patameter_Description, Employee.Enterprise_Staff_Id, (Employee.First_Name + ' ' + Employee.Last_Name) empname, Emp_Property.Mark
FROM Emp_Property
INNER JOIN Employee ON Employee.Enterprise_Staff_Id = Emp_Property.Emp_Id
INNER JOIN Parameter ON Parameter.Id = Emp_Property.Parameter_Id
WHERE Employee.Enterprise_Staff_Id = 22

SELECT * FROM #CompareJob
FULL OUTER JOIN #CompareEmp ON #CompareJob.Parameter_Id = #CompareEmp.Parameter_Id
0 голосов
/ 01 октября 2009

Согласитесь с Дэнни, используйте метод 'LEFT OUTER JOIN' вместо 'INNER JOIN', поскольку он будет возвращать только те строки, где запись найдена в обеих таблицах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...