2017-08-08 65 views
0

这就是我想要做的如何避免“不支持此类型的相关子查询模式”

select something1,something2,account_id, 
(select u.organization_id 
      from public.sfdc_contact sfdcc 
      join public.users u on u.email=sfdcc.email 
      where sfdcc.account_id=account_id 
      group by u.organization_id 
      order by count(*) 
     limit 1 
     ) 
from something 

红移提示我的错误,因为我试图ORDER BY计数。但是我不能在子查询中有2列,有什么提示?

+0

改为使用连接(写一个单独的子查询并将其连接到主查询) – AlexYes

回答

0

不完全确定此结构是否完全符合您的需求,但使用诸如ROW_NUMBER()OVER()的“window functions”可用于从联合派生表(子查询)提供单个行。例如:

SELECT 
     s.something1 
    , s.something2 
    , s.account_id 
    , d2.organization_id 
    , d2.cn 
FROM something s 
LEFT JOIN (
     SELECT 
      organization_id 
      , account_id 
      , cn 
      , ROW_NUMBER() OVER (PARTITION BY organization_id ORDER BY cn) rn 
     FROM (
      SELECT 
        u.organization_id 
       , sfdcc.account_id 
       , COUNT(*) OVER (PARTITION BY u.organization_id, sfdcc.account_id) cn 
      FROM public.sfdc_contact sfdcc 
      JOIN public.users u ON u.email = sfdcc.email 
      ) d1 
    ) d2 ON s.account_id = d2.account_id and d2.rn = 1 

使用COUNT()OVER()的可能是不必要的,这可能是更务实:

SELECT 
     s.something1 
    , s.something2 
    , s.account_id 
    , d2.organization_id 
    , d2.cn 
FROM something s 
LEFT JOIN (
     SELECT 
      organization_id 
      , account_id 
      , cn 
      , ROW_NUMBER() OVER (PARTITION BY organization_id ORDER BY cn) rn 
     FROM (
      SELECT 
        u.organization_id 
       , sfdcc.account_id 
       , COUNT(*) cn 
      FROM public.sfdc_contact sfdcc 
      JOIN public.users u ON u.email = sfdcc.email 
      GROUP BY 
        u.organization_id 
       , sfdcc.account_id 
      ) d1 
    ) d2 ON s.account_id = d2.account_id and d2.rn = 1 

还要注意的是,如果你想要的最高计数然后改变使用的顺序在row_number到DESCending:

 
, ROW_NUMBER() OVER (PARTITION BY organization_id ORDER BY cn DESC) rn