SQL – Ajouter des données manquantes dans une requête joing externe gauche

J'ai datatables suivantes
Composants

componentid title 1 houseRent 2 medical 3 Travelling Allowance 

empPayrollMaster

 MasterID EmployeeID SalaryMonthID 1 101 1 2 102 1 3 103 1 

empPayrollDetail

 DetailID MasterID ComponentID amount 1 1 1 100 2 1 2 500 3 2 1 300 4 2 3 250 5 3 1 150 6 3 2 350 7 3 3 450 

Sortie requirejse

 EmployeeID MasterID ComponentID amount 101 1 1 100 101 1 2 500 101 1 3 0 102 2 1 300 102 1 2 0 102 2 3 250 103 3 1 150 103 3 2 350 103 3 3 450 

Pour get la sortie requirejse si je fais la jointure externe gauche entre les components et empPayrollDetail je reçois null dans EmployeeID et MasterID et montant Columns. Comment modifier la jointure gauche pour get la sortie requirejse

Vous devez faire un CROSS JOIN sur les Components et empPayrollMaster pour générer d'abord toutes les combinaisons d'employés et de composants. Ensuite, faites un LEFT JOIN sur empPayrollDetail pour get le résultat, en utilisant ISNULL(amount, 0) pour les amount NULL .

SQL Fiddle

 SELECT epm.EmployeeID, epm.MasterID, c.ComponentID, amount = ISNULL(epd.amount, 0) FROM empPayrollMaster epm CROSS JOIN Components c LEFT JOIN empPayrollDetail epd ON epd.MasterID = epm.MasterID AND epd.ComponentID = c.ComponentID 

Essaye ça

  select empPayrollMaster.EmployeeID,empPayrollMaster.MasterID, Components.componentid,isnull(empPayrollDetail.amount,0) from empPayrollMaster left join Components on empPayrollMaster.EmployeeID is not null left join empPayrollDetail on empPayrollDetail.MasterID = empPayrollMaster.MasterID and empPayrollDetail.ComponentID = Components.componentid 

Essayez de cette façon

 select c.EmployeeID,d.MasterID,c.ComponentID,isnull(d.amount,0) as amount from ( select * from Components a Cross join empPayrollMaster b) c left outer join empPayrollDetail d on d.componentid =c.componentid 

Comme vous voulez le montant du composant pour chaque employé dans la table maître, vous devez utiliser un insull(payrole_detail.amount,0) ou, comme @Turophile l'a souligné, la fonction standard SQL coalesce(payrole_detail.amount,0) pour la colonne montants.

 SELECT Customers.CustomerName, Orders.OrderID FROM Customers INNER JOIN Orders ON Customers.CustomerID=Orders.CustomerID ORDER BY Customers.CustomerName;