2009-10-01 7 views
0

J'ai un problème pour obtenir ce sql statemen pour retourner ce que je veux: Je veux qu'il renvoie une liste de propriétés à la fois l'employé ou Job_Profile. Si l'un d'entre eux n'ont pas la propriété, il doit retourner NULL dans cette ligne/colonne Maintenant, le sql ressemble:instruction SQL JOIN et WHERE

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) 

Le résultat est:

Analyse test 1 3 22 

Et je voudrais que ce soit quelque chose comme ceci:

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 

Je sais qu'il ya un problème quand je: - rejoindre Emp_Property - font la clause WHERE

Répondre

3

Essayez LEFT OUTER JOIN lors de l'adhésion Emp_Property

+0

J'ai essayé et utilisé LEFT OUTER JOIN à la place du droit JOIN et le résultat que je sors est le même est le même. J'ai aussi essayé de faire toutes les jointures FULL OUTER et de l'exécuter sans la clause where et je n'ai toujours pas les valeurs NULL attendues – Jorn

0

D'accord avec Danny, utilisez la méthode « LEFT OUTER JOIN » au lieu de 'INNER JOIN car cela renvoie uniquement les lignes où une entrée se trouve dans les deux tableaux.

1

J'ai trouvé une solution, je devais faire des tables temporaires et les rejoindre:

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