Как извлечь столбцы из производной таблицы или подзапроса - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть запрос, который ищет записи, у которых нет соответствующего номера счета, и пытается сопоставить эти учетные записи по адресу.

Я получаю результаты, которые хочу, но хочу включить столбцы изтаблица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  |

1 Ответ

0 голосов
/ 06 февраля 2019

Вы используете «существует», когда рекомендуется «внутреннее соединение».Реструктурируйте следующим образом:

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' будет давать не более 1 записи на строку в строке 't'.С 'cross apply', если результатом 'v' является отсутствие записей, то 't' не будет возвращать строку (аналогично 'Существует' или 'Внутреннему объединению').

...