2011-02-17 97 views
1

为什么这个查询不能正确执行?2表中的左连接

SELECT pr.ProjectNumber, 
    SUM(ma.TotalAmount) As CostOfMaterials, 
    SUM(ot.TotalAmount) AS CostOfOthers 
FROM [dbo].[tblProject] AS pr 
LEFT JOIN [dbo].[tblCostOfMaterials] AS ma ON pr.ProjectNumber=ma.ProjectNumber 
LEFT JOIN [dbo].[tblCostOfOthers] AS ot ON pr.ProjectNumber=ot.ProjectNumber 
GROUP BY pr.ProjectNumber 
+2

您是否收到错误?如果是这样,错误是什么意思?如果你只是没有得到你想要的结果,你希望达到什么目的,这会给你什么?我们需要更多信息来帮助你。 – anothershrubery 2011-02-17 12:03:58

+1

为什么这个问题不正确?没有某种错误信息,很难提供帮助。 – Dai 2011-02-17 12:04:37

回答

1

我假定你的意思是说,因为每个表有多个行的特定项目编号,你可以多次计算相同的值。为了避免这种情况,你可以使用

;WITH ma 
    AS (select ProjectNumber, 
       SUM(TotalAmount) as CostOfMaterials 
     FROM [dbo].[tblCostOfMaterials] 
     GROUP BY ProjectNumber), 
    ot 
    AS (select ProjectNumber, 
       SUM(TotalAmount) as CostOfOthers 
     FROM [dbo].[tblCostOfOthers] 
     GROUP BY ProjectNumber) 
SELECT pr.ProjectNumber, 
     CostOfMaterials, 
     CostOfOthers 
FROM [dbo].[tblProject] AS pr 
     LEFT JOIN ma 
     ON pr.ProjectNumber = ma.ProjectNumber 
     LEFT JOIN ot 
     ON pr.ProjectNumber = ot.ProjectNumber 

为什么你这种行为的原因是因为你越来越小直角连接

WITH tblProject (ProjectNumber) AS 
(
SELECT 1 
),tblCostOfMaterials(ProjectNumber, TotalAmount) AS 
(
SELECT 1,101 UNION ALL 
SELECT 1,201 UNION ALL 
SELECT 1,301 
), 
tblCostOfOthers(ProjectNumber, TotalAmount) AS 
(
SELECT 1,100 UNION ALL 
SELECT 1,200 
) 
SELECT * 
FROM [tblProject] AS pr 
LEFT JOIN [tblCostOfMaterials] AS ma ON pr.ProjectNumber=ma.ProjectNumber 
LEFT JOIN [tblCostOfOthers] AS ot ON pr.ProjectNumber=ot.ProjectNumber 

返回

ProjectNumber ProjectNumber TotalAmount ProjectNumber TotalAmount 
------------- ------------- ----------- ------------- ----------- 
1    1    101   1    100 
1    1    101   1    200 
1    1    201   1    100 
1    1    201   1    200 
1    1    301   1    100 
1    1    301   1    200 

你可以看到,值由另一个表中的匹配行数重复,因此SUM将不正确。