加入两个表并返回表

时间:2015-12-29 16:53:40

标签: sql join

我有两个表,一个包含零件成本,另一个包含人工成本。

我想加入这些表来显示所有人工和零件成本,但Part Costs表中有一些记录在Labour Costs表中不存在,反之亦然。

零件成本表

Call Ref    Serial Number   Parts Costs
1111        AB66            12
2222        AC66            100
3333        AD66            200
4444        AE66            55
5555        AF66            54

人工成本表

Call Ref    Serial Number   Labour Costs
8888        AG66            200
1111        AB66            300
2222        AC66            400
9999        AH66            500

我想要达到的结果是:

Call Ref    Serial Number   Parts Costs Labour Costs
1111        AB66            12          300
2222        AC66            100         400
3333        AD66            200         0
4444        AE66            55          0
5555        AF66            54          0
8888        AG66            0           200
9999        AH66            0           500

2 个答案:

答案 0 :(得分:1)

我假设您的加入密钥是Call Ref + Serial Number。

在MS SQL Server中,您可以使用完整联接来实现上述目的:

SELECT CallRef       = ISNULL(pc.CallRef, lc.CallRef),
       SerialNumber  = ISNULL(pc.SerialNumber, lc.SerialNumber),
       PartCost      = ISNULL(pc.PartCost, 0),
       LaborCost     = ISNULL(lc.LaborCost, 0)
FROM   PartCost pc
FULL JOIN LaborCost lc ON pc.CallRef = lc.CallRef AND pc.SerialNumber = lc.SerialNumber

答案 1 :(得分:1)

你正在寻找的是一个完整的外部联盟。

例如:

SELECT
    COALESCE(LC.call_ref, PC.call_ref) AS call_ref,
    COALESCE(LC.serial_number], PC.serial_number) AS serial_number,
    LC.cost AS labour_costs,
    PC.cost AS parts_costs
FROM
    Labour_Costs LC
FULL OUTER JOIN Parts_Costs PC ON
    PC.call_ref = LC.call_ref AND
    PC.serial_number = LC.serial_number

您应该考虑删除数据库中表/列名称中的空格。一些第三方产品不能很好地与它们配合使用,并且它们可以使编码麻烦,因为您需要始终使用括号作为对象名称(也使代码不易读取,IMO)。

此外,此代码未考虑在其中一个表中出现多行以获得相同引用/序列号的可能性。如果有可能,那么您需要SUM费用并添加GROUP BY