【问题标题】:How To Pull In Columns From A Derived Table Or Sub Query如何从派生表或子查询中提取列
【发布时间】:2019-06-29 20:36:07
【问题描述】:

我有一个查询,它查找没有匹配帐号的记录并尝试按地址匹配这些帐户。

我得到了我想要的结果,但我想包含下表 2 中的列。我该怎么做?

Select DISTINCT
              account_num
        ,product
        ,accountName
        ,address_1
        ,address_2
        ,city
        ,state
        ,zip
        ,short_address
INTO #Matching_Address
From #Non_Matching_Accounts t
Where EXISTS 
(SELECT * FROM (SELECT 
                       left(ADDRESS_LINE1_TXT,20) AS matching_add 
                      ,CITY
                      ,STATE
                      ,ZIP
                      ,ACCOUNT_OWNER
               From [database].[dbo].[table2]) v (matching_add, CITY, STATE,ZIP,ACCOUNT_OWNER)
               WHERE 
               t.short_address= v.matching_add 
               AND t.city= v.NAME
               AND t.state = v.STATE
               AND t.zip = v.ZIP
               AND t.accountName LIKE '%'+v.ACCOUNT_OWNER+'%')

我试过了:

Select DISTINCT
              account_num
        ,product
        ,accountName
        ,address_1
        ,address_2
        ,city
        ,state
        ,zip
        ,short_address
              ,matching_add 
              ,CITY
        ,STATE
        ,ZIP
        ,ACCOUNT_OWNER
INTO #Matching_Address
From #Non_Matching_Accounts t
Where EXISTS 
(SELECT * FROM (SELECT 
                       left(ADDRESS_LINE1_TXT,20) AS Select DISTINCT
              account_num
        ,product
        ,accountName
        ,address_1
        ,address_2
        ,city
        ,state
        ,zip
        ,short_address
INTO #Matching_Address
From #Non_Matching_Accounts t
Where EXISTS 
(SELECT * FROM (SELECT 
                       left(ADDRESS_LINE1_TXT,20) AS matching_add 
                      ,CITY
                      ,STATE
                      ,ZIP
                      ,ACCOUNT_OWNER
               From [database].[dbo].[table2]) v (matching_add, CITY, STATE,ZIP,ACCOUNT_OWNER)
               WHERE 
               t.short_address= v.matching_add 
               AND t.city= v.NAME
               AND t.state = v.STATE
               AND t.zip = v.ZIP
               AND t.accountName LIKE '%'+v.ACCOUNT_OWNER+'%')
               From [database].[dbo].[table2]) v (matching_add, CITY, STATE,ZIP,ACCOUNT_OWNER)
               WHERE 
               t.short_address= v.matching_add 
               AND t.city= v.NAME
               AND t.state = v.STATE
               AND t.zip = v.ZIP
               AND t.accountName LIKE '%'+v.ACCOUNT_OWNER+'%')

预期结果:

acct_num|prd|actName|add1|add2|city|state|zip|act_num2|prd2|actName|add1|add2|city2|state2|zip2|
----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
a   |  a  |  a |  a  |  a | a | a  | a   | a   | a   | a   | a  | a  | a    a|  a 
b   |  b  |  b |  b  |  b |  b  |  b |  b  |  b | b   |  b  |  b |  b  |  b |  b  
c   |  c  |  c |  c  |  c | c  |  c  |  c |  c  |  c | c  |  c |  c  |  c |  c |
d   |  d  |  d |  d  |  d |  d  |  d |  d  |  d |  d  |  d |  d  |  d | d |  d  |

【问题讨论】:

    标签: sql sql-server subquery exists derived-table


    【解决方案1】:

    当建议使用“内部连接”时,您使用的是“存在”。重组如下:

    select 
    distinct  t.account_num,
              t.product,
              t.accountName,
              t.address_1,
              t.address_2,
              t.city,
              t.state,
              t.zip,
              t.short_address,
    
              matching_add = left(v.address_line1_txt,20),
              vCity = v.city,
              vState = v.state,
              vZip = v.zip,
              v.account_owner
    
    into      #Matching_Address
    from      #Non_Matching_Accounts t
    join      [database].[dbo].[table2] v
                  on  t.short_address = v.matching_add 
                  and t.city = v.name
                  and t.state = v.state
                  and t.zip = v.zip
                  and t.accountName like '%' + v.account_owner + '%'
    

    内部连接(或简称“连接”)只会返回匹配项,因此在这个意义上它就像“存在”。但它使您可以使用右侧表格中的列。

    我的预感是你可能已经尝试过了。我在您的查询中看到了一个“不同的”,这对于“存在”来说可能是不必要的。您是否因为重复您的行而放弃了“内部联接”?如果是这样,“存在”仍然不是答案。也许交叉申请可以帮助您:

    select       ... (same as above)
    into         #Matching_Address
    from         #Non_Matching_Accounts t
    cross apply  (
                    select 
                    top 1     *
                    from      [database].[dbo].[table2] v
                    where     t.short_address = v.matching_add 
                    and       t.city = v.name
                    and       t.state = v.state
                    and       t.zip = v.zip
                    and       t.accountName like '%' + v.account_owner + '%'
                    order by  v.matching_add -- or whatever puts the better one on top
                 ) v
    

    使用 'top 1','v' 结果将在 't' 中每行产生不超过 1 条记录。使用 'cross apply',如果 'v' 的结果是无记录,则 't' 不会返回一行,(类似于 'exists' 或 'inner join')。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 2021-11-03
      • 2016-08-05
      • 2016-07-17
      相关资源
      最近更新 更多