2017-08-08 32 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