在 SQL Server 中,我有一个和表Visit
之间的连接表。Customer
Store
我试图寻找:
CustomerID
的列表- 仅访问过 1 家商店的人 (
StoreID
) - 但我感兴趣的只是
Customers
访问过特定商店(1、10、16、42) - 因此我想拒绝访问过商店 1 和 2 的客户,因为他们已经访问过多家商店
- 如果客户多次光顾同一家商店,我希望将其包含在结果中。表格
Visit
中有日期和其他列,因此同一个客户在多个日期多次光顾。
我认为以下查询是正确的——因为它似乎返回了正确的结果:
SELECT DISTINCT
v.CustomerID
FROM
Visit v
INNER JOIN
(SELECT CustomerID
FROM
(SELECT DISTINCT CustomerID, StoreID
FROM Visit) temp
GROUP BY CustomerID
HAVING COUNT(*) = 1) c ON v.CustomerID = c.CustomerID
WHERE
v.StoreID IN (1, 10, 16, 42)
不过我想知道是否有任何方法可以简化/清理它,因为其中有多个DISTINCT
和子句。GROUP BY
注意:这并不理想,但如果有必要,我可以使用这样的查询:返回以任意组合访问过任意所需商店(1、10、16、42)的顾客,访问次数任意,只要他们没有访问过不在该列表中的商店。
也许是这样的:
COUNT(DISTINCT StoreID)
为您提供仅拥有一家独特商店的客户注意:您也可以使用:
MAX(StoreId) = MIN(StoreId)
代替 COUNT(DISTINCT),因为在某些情况下它具有更好的性能特性。为了了解它是哪家商店,我使用
MAX(x.StoreID)
。MAX 或 MIN 在这里并不重要,只要它是某种聚合即可。