我有两个表,CustomerCost
和Products
如下所示:
我正在使用以下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
我在这里做什么错了?
答案 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
控制联接条件。
外部联接是将FROM
和ON
添加到SQL-92的原因。旧版SQL-89
语法不支持它们,并且不同的供应商添加了不同的内容,
不支持它们的语法。