如何在左联接上设置条件

时间:2018-12-05 18:56:24

标签: sql sql-server join

我有两个表,CustomerCostProducts如下所示:

enter image description here

我正在使用以下SQL查询联接两个表:

SELECT custCost.ProductId,
       custCost.CustomerCost
FROM CUSTOMERCOST Cost
LEFT JOIN PRODUCTS prod ON Cost.productId =prod.productId
WHERE prod.productId=4
  AND (Cost.Customer_Id =2717
       OR Cost.Customer_Id IS NULL)

加入的结果是: joins result

我想做的是,当我传递customerId 2717时,它应该仅返回特定的客户成本,即258.93,而当customerId不匹配时,则仅应将成本视为312.50

我在这里做什么错了?

3 个答案:

答案 0 :(得分:1)

您将获得预期的输出,如下所示:

SELECT Cost.ProductId,
       Cost.CustomerCost
FROM CUSTOMERCOST Cost
INNER JOIN PRODUCTS prod ON Cost.productId = prod.productId
WHERE prod.productId=4
  AND Cost.Customer_Id = 2717

但是,如果要允许将客户ID作为NULL传递,则必须将最后一行更改为AND Cost.Customer_Id IS NULL。要动态地执行此操作,您需要使用变量并根据输入生成查询。

您发布的原始查询中的问题是您使用的别名custCost在查询中不存在。

编辑:实际上,您甚至不需要加入。 CUSTOMERCOST表似乎同时具有客户ID和产品ID。

您可以简单地:

SELECT
    Cost.ProductId, Cost.CustomerCost 
FROM
    CUSTOMERCOST Cost
WHERE
    Cost.Customer_Id = 2717
    AND Cost.productId = 4

答案 1 :(得分:0)

您似乎想要:

SELECT c.*
FROM CUSTOMERCOST c
WHERE c.productId = 4 AND c.Customer_Id = 2717
UNION ALL
SELECT c.*
FROM CUSTOMERCOST c
WHERE c.productId = 4 AND c.Customer_Id IS NULL AND
      NOT EXISTS (SELECT 1 FROM CUSTOMERCOST c2 WHERE c2.productId = 4 AND c2.Customer_Id = 2717);

也就是,如果客户存在匹配成本,则取该成本。否则,请采用默认费用。

答案 2 :(得分:0)

SELECT custCost.ProductId,
       custCost.CustomerCost
FROM CUSTOMERCOST Cost
LEFT JOIN PRODUCTS prod
ON Cost.productId =prod.productId
  AND (Cost.Customer_Id =2717 OR Cost.Customer_Id IS NULL)
WHERE prod.productId=4

WHERE适用于连接的行。 ON控制联接条件。

外部联接是将FROMON添加到SQL-92的原因。旧版SQL-89 语法不支持它们,并且不同的供应商添加了不同的内容, 不支持它们的语法。