我有以下查询:
SELECT rt.ID, rt.Name, rt.Rate, rt.Colour, vtb.ID AS 'vtbID', vtb.Value, rt.StdID
FROM Rates AS rt
LEFT OUTER JOIN VehicleTypeCostsBreakdown AS vtb ON rt.ID = vtb.RateID
LEFT OUTER JOIN VehicleTypeCostsDepots AS vtd ON vtd.ID = vtb.VehicleTypeDepotID AND vtd.DepotID = @DepotID AND vtd.VehicleTypeID = @VehicleTypeID
基本上,我想从Rates表中选择所有'rate',但是如果'vtd'表中存在任何对速率的引用,其参数与@DepotID和@VehicleTypeID匹配,我想带回Value为了那个原因。如果它没有任何引用,我希望它的'vtb.Value'选择为空白。
使用上面的SQL,它似乎总是返回'vtb.Value'值的值,即使参数为null。我错过了什么吗?
答案 0 :(得分:2)
以这种方式试试。基本上,您将LEFT JOIN转到由VehicleTypeCostsBreakdown和VehicleTypeCostsDepots之间的INNER JOIN形成的派生表。 INNER JOIN仅在您满足所有条件时才匹配。
SELECT rt.ID, rt.Name, rt.Rate, rt.Colour, vtb.ID AS 'vtbID', vtb.Value, rt.StdID
FROM Rates AS rt
LEFT OUTER JOIN VehicleTypeCostsBreakdown AS vtb
INNER JOIN VehicleTypeCostsDepots AS vtd
ON vtd.ID = vtb.VehicleTypeDepotID
AND vtd.DepotID = @DepotID
AND vtd.VehicleTypeID = @VehicleTypeID
ON rt.ID = vtb.RateID
答案 1 :(得分:0)
试试这个:
SELECT rt.ID, rt.Name, rt.Rate, rt.Colour, vtb.ID AS 'vtbID', vtb.Value, rt.StdID
FROM Rates AS rt
LEFT JOIN VehicleTypeCostsBreakdown AS vtb ON rt.ID = vtb.RateID
LEFT JOIN VehicleTypeCostsDepots AS vtd ON vtd.ID = vtb.VehicleTypeDepotID
WHERE vtd.ID IS NULL OR (vtd.DepotID = @DepotID AND vtd.VehicleTypeID = @VehicleTypeID)
您无需指定LEFT JOIN
是OUTER JOIN
,也不应将条件放在ON
的{{1}}部分,这就是{ {1}}适用于。
答案 2 :(得分:0)
尝试:
SELECT rt.ID, rt.Name, rt.Rate, rt.Colour, vtb.ID AS 'vtbID', vtb.Value, rt.StdID
FROM Rates AS rt
LEFT OUTER JOIN (SELECT b.ID, b.Value, b.RateID
FROM VehicleTypeCostsBreakdown AS b
JOIN VehicleTypeCostsDepots AS d
ON d.ID = b.VehicleTypeDepotID AND
d.DepotID = @DepotID AND
d.VehicleTypeID = @VehicleTypeID)
AS vtb ON rt.ID = vtb.RateID