查询选择然后扩展数据

时间:2014-03-21 16:45:03

标签: sql sql-server procedure

对于令人困惑的标题感到抱歉,但我不确定如何定义此问题。

背景是: 两个表 - 客户表和帐户表。 这些表连接在一个客户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过滤器列表中的其他帐户。

有什么想法吗?

2 个答案:

答案 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'))

子查询获取至少包含一个指定帐户的所有客户的列表,“外部”查询获取这些客户的所有帐户。