不确定标题是否完整地解释了这个场景,所以我将尽可能具有描述性。我正在使用SQL Server数据库并具有以下4个表:
客户:
CustomerID CustomerName
--------------------------
100001 Mr J Bloggs
100002 Mr J Smith
策略:
PolicyID PolicyTypeID CustomerID
-----------------------------------
100001 100001 100001
100002 100002 100001
100003 100003 100001
100004 100001 100002
100005 100002 100002
POLICYTYPES :
PolicyTypeID PolTypeName ProviderID
-----------------------------------------
100001 ISA 100001
100002 Pension 100001
100003 ISA 100002
PROVIDERS :
ProviderID ProviderName
--------------------------
100001 ABC Ltd
100002 Bloggs Plc
这显然是一个精简版本,实际数据库包含更多记录。我要做的是返回一个只有某个提供商的产品的客户列表。因此,在上面的示例中,如果我想使用此SQL返回具有ABC Ltd策略的客户:
SELECT
C.CustomerName, P.PolicyID, PT.PolTypeName, Providers.ProviderName
FROM
Customers C
LEFT JOIN
Policies P ON C.CustomerID = P.CustomerID
LEFT JOIN
PolicyTypes PT ON P.PolicyTypeID = PT.PolicyTypeID
LEFT JOIN
Providers PR ON PR.ProviderID = PT.ProviderID
WHERE
PR.ProviderID = 100001
它将返回Customers表中的两个客户。但客户Mr J Bloggs实际上也持有Bloggs Plc提供的政策。我不想要这个。我只想退回那些只持有ABC有限公司政策的客户,所以我需要的SQL只能归还J Smith先生。
希望我一直很清楚,如果没有,请告诉我。
非常感谢提前
史蒂夫
答案 0 :(得分:1)
脏但可读:
SELECT C.CustomerName, P.PolicyID, PT.PolTypeName, Providers.ProviderName
FROM Customers C LEFT JOIN Policies P ON C.CustomerID = P.CustomerID
LEFT JOIN PolicyTypes PT ON P.PolicyTypeID = PT.PolicyTypeID
LEFT JOIN Providers PR ON PR.ProviderID = PT.ProviderID
WHERE PR.ProviderID = 100001 AND C.CustomerName NOT IN (
SELECT C.CustomerName
FROM Customers C LEFT JOIN Policies P ON C.CustomerID = P.CustomerID
LEFT JOIN PolicyTypes PT ON P.PolicyTypeID = PT.PolicyTypeID
LEFT JOIN Providers PR ON PR.ProviderID = PT.ProviderID
WHERE PR.ProviderID <> 100001
)
答案 1 :(得分:1)
这个想法是你另外在与其他提供商链接的customerid上执行NOT IN:
SELECT C.CustomerName, P.PolicyID, PT.PolTypeName, Providers.ProviderName
FROM Customers C LEFT JOIN Policies P ON C.CustomerID = P.CustomerID
LEFT JOIN PolicyTypes PT ON P.PolicyTypeID = PT.PolicyTypeID
LEFT JOIN Providers PR ON PR.ProviderID = PT.ProviderID
WHERE PR.ProviderID = 100001
--NEW PART
AND C.CustomerID NOT IN
(
SELECT P.CustomerID
FROM Policies P
LEFT JOIN PolicyTypes PT ON P.PolicyTypeID = PT.PolicyTypeID
LEFT JOIN Providers PR ON PR.ProviderID = PT.ProviderID
WHERE PR.ProviderID <> 100001
)
答案 2 :(得分:1)
尝试这个...
SELECT C.CustomerName, P.PolicyID, PT.PolTypeName, Providers.ProviderName
from Customers C inner join POLICIES P ON C.CustomerID = P.CustomerID
inner join PT ON P.PolicyTypeID = PT.PolicyTypeID
inner join Providers PR ON PR.ProviderID = PT.ProviderID
where PR.ProviderID = 100001 and c.CustomerID not in
(SELECT C.CustomerID from Customers C
inner join POLICIES P ON C.CustomerID = P.CustomerID
inner join PT ON P.PolicyTypeID = PT.PolicyTypeID
inner join Providers PR ON PR.ProviderID = PT.ProviderID where PR.ProviderID <> 100001)