【发布时间】:2015-10-05 15:42:21
【问题描述】:
我正在尝试查询我们的数据库以提取客户数据。关键部分是:
拉出所有未购买product_a的客户/订单。
这将列出已购买 product_b、product_c 和 product_d 的客户/订单。
但它需要确保客户从未购买过product_a。我需要排除它们。
这是处理“不存在”的正确方法吗?我仍然觉得它包括一些购买 product_a 的记录。
SELECT
*
FROM
orders
JOIN customers AS cus ON orders.CustomerNumber = cus.CustomerNumber
WHERE
product != 'product_a'
OR (
HomeTelephone = ''
AND MobileTelephone != ''
)
AND NOT EXISTS (
SELECT
OrderNumber
FROM
orders AS o
JOIN customers AS c ON o.CustomerNumber = c.CustomerNumber
WHERE
c.EmailAddress = cus.EmailAddress
AND Product = 'product_a'
AND completed = 1
)
ORDER BY
orderdate
如果没有 NOT EXISTS 语句,即使他们单独购买了 product_a,也可以包含客户记录,对吗?
【问题讨论】:
-
你的问题是你的
WHERE子句中的OR。它将包括那些具有HomeTelephone = '' AND MobileTelephone != ''的记录。您对这部分查询的意图是什么? -
在 where 子句中... 将括号放在 product 之前和 OR 括号之后,以查看查询处理器实际在做什么。然后分析你真正想要做什么。 OR 的作用可能与您想象的不同。