对于令人困惑的标题感到抱歉,但我不确定如何定义此问题。
背景是: 两个表 - 客户表和帐户表。 这些表连接在一个客户ID号上。 帐户表包含NAICS或SIC代码字段。 此NAICS(SIC)代码用于选择客户。报告规范中仅定义了特定的SICS。 但是,客户可能在OTHER SIC或NAICS代码下有其他帐户。 必须选择在WHERE中用于过滤客户的SIC或NAICS代码的帐户以及链接到该客户的任何其他帐户。
查询的简化版本如下:
SELECT
dbo.CUSTOMER.customer_id,
dbo.CUSTOMER.customer_full_name,
dbo.ACCOUNT.account_id,
dbo.ACCOUNT.date_first_account_opened,
dbo.ACCOUNT.NAICS_No,
dbo.ACCOUNT.NAICS_description
FROM
dbo.CUSTOMER
LEFT OUTER JOIN dbo.ACCOUNT WITH (nolock)
ON dbo.CUSTOMER.account_id = dbo.ACCOUNT.account_id
WHERE
dbo.account.NAICS)No in ('6011','6062', '6021', '6022', '6035', '6036', '6029', '6081', '522110')-- SIC and NAICS codes
此代码将返回由WHERE子句中的条件选择的X个客户及其关联帐户。我需要得到的是与客户关联的任何不在WHERE过滤器列表中的其他帐户。
有什么想法吗?
答案 0 :(得分:0)
当外部加入不在where子句中放置标准时。您的where子句将您的连接转换为内连接,因为只有找到的匹配具有NAICS_No。将where子句移动到ON子句。
SELECT
dbo.CUSTOMER.customer_id,
dbo.CUSTOMER.customer_full_name,
dbo.ACCOUNT.account_id,
dbo.ACCOUNT.date_first_account_opened,
dbo.ACCOUNT.NAICS_No,
dbo.ACCOUNT.NAICS_description
FROM
dbo.CUSTOMER
LEFT OUTER JOIN dbo.ACCOUNT WITH (nolock)
ON dbo.CUSTOMER.account_id = dbo.ACCOUNT.account_id
AND dbo.account.NAICS_No in ('6011','6062', '6021', '6022', '6035', '6036', '6029', '6081', '522110')-- SIC and NAICS codes
答案 1 :(得分:0)
这样的事情应该有效:
SELECT
cu.customer_id,
cu.customer_full_name,
ac.account_id,
ac.date_first_account_opened,
ac.NAICS_No,
ac.NAICS_description
FROM
dbo.CUSTOMER cu
INNER JOIN dbo.ACCOUNT ac
ON cu.account_id = ac.account_id
WHERE cu.customer_id in (-- List of customers with at least one "target" account
select distinct cu2.customer_id
from dbo.CUSTOMER cu2
inner join dbo.ACCOUNT ac2
on ac2.account_id = cu2.account_id
where ac.NAICS_No in ('6011','6062', '6021', '6022', '6035', '6036', '6029', '6081', '522110'))
子查询获取至少包含一个指定帐户的所有客户的列表,“外部”查询获取这些客户的所有帐户。