ROW_NUMBER Oracle - странное поведение (добавляет строки) - PullRequest
0 голосов
/ 12 марта 2020

Вложенный запрос между --- 1 --- и --- 2 --- возвращает одну строку.
Но полный запрос возвращает несколько строк.
Как это возможно?

Это не имеет никакого смысла для меня, я думаю, что мне здесь не хватает чего-то очень тонкого.

 select                                                                                                             

 distinct                                                                                                           


 ROW_NUMBER() OVER (ORDER BY xx."accountCreateDate" DESC) as "rowNumber",
 xx.* 


 from 
 (
     --- 1 ---
         select 
         some stuff 
         from                                                                                                               
       t1                                     
       left join t2  on t1.id = t2.id 


         --- 2 ---
 ) xx  ;

Oracle информация о версии:

Oracle База данных 11g Enterprise Edition, выпуск 11.2.0.2.0 - 64-разрядная версия
PL / SQL Выпуск 11.2.0.2.0 - Производство
"CORE 11.2.0.2.0 Производство"
TNS для Linux: Версия 11.2.0.2.0 - Производство
NLSRTL Версия 11.2.0.2.0 - Производство

ПОЛНЫЙ ЗАПРОС:

     select                                                                                                             

     distinct 

     ROW_NUMBER() OVER (ORDER BY xx."accountCreateDate" DESC) as "rowNumber",
     xx.* 

     from 
     (

             select 
             replace(t.company_name,'"', '###') as "companyName",                                                               
             t.main_email_address as "mainEmailAddress",                                                                        
             t.main_telephone_number as "mainPhoneNumber",                                                                      
             t.xref_id as "businessID",                                                                                    
             COALESCE(t.business_record_id, TO_NUMBER(a.ACCOUNT_ID__C)) as "integrationID",                                                                           

             a.id as "sAccountID",                                                                                           


             t.d_account_id as "dddAccountID",                                                                              
             t.region_name as "regionName",                                                                                     
             t.customer_key as "customerKey",                                                                                   
             t.region_key as "regionKey",                                                                                       
             t.ACCOUNT_CREATE_DT as "accountCreateDate",                                                                        
             t.ACCOUNT_LAST_UPDATE_DT as "accountLastUpdateDate",                                                               
             t.INSERT_DATE as "insertDate",                                                                                     
             t.LAST_REFRESH_DATE as "lastRefreshDate"                                                                           

             from                                                                                                               
             CRM_01.STDD_ACCOUNT t                                                                                            
             left join SF.Acct_Ids_Account a on t.xref_id = a.business_id_hidden__c                                
             where                                                                                                              
             (                                                                                                                  
             (1=1)                                                                                           
             )                                                                                                                  

             and                                                                                                                
             (                                                                                                                  
             ((t.business_record_id = '14413973') or (a.ACCOUNT_ID__C = '14413973'))                                                                                       
             )   


     ) xx  ;

1 Ответ

2 голосов
/ 12 марта 2020

Это невозможно с select. Но вы используете select distinct. Подзапрос на самом деле не возвращает одну строку. Он возвращает несколько строк, все с одинаковыми значениями.

Когда вы добавляете row_number(), который добавляет уникальный столбец. Вуаля! Появляется больше строк. row_number() вычисляется до select distinct.

Здесь - простая скрипта db <>, иллюстрирующая это явление.

Если вы используете dense_rank() вместо этого, тогда вы, вероятно, будете делать то, что хотите. Вы также можете использовать подзапрос, а затем row_number() во внешнем запросе. Тем не менее, я обычно думаю, что select distinct используется для маскировки других проблем в запросах / данных.

...