2009-10-01 3 views
0

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

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

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

+0

Я попытался это и Б LEFT OUTER JOIN вместо RIGHT JOIN и результат я получаю из такого же одно и то же. Я также попытался сделать все соединения FULL OUTER и запустить его без предложения where, и я все еще не получаю значения NULL, которые я ожидаю – Jorn

0

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

1

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

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