Cum să se întoarcă mai mult de un rând de subinterogare folosit ca expresie

0

Problema

select case 
         when p.property_type ='APARTMENT_COMMUNITY' 
           then (select fp.bedroom_count 
                 from floor_plans fp 
                 where fp.removed = false 
                 and fp.property_id=p.id) 
         else (select pu.bedroom_count 
               from property_units pu 
               where pu.removed = false 
               and pu.property_id=p.id) 
        end 
from properties p 
where p.id =550

Eu am asta,bedroom_count nu este un singur rând,așa că dă această eroare

EROARE: mai mult de un rând returnate de o subinterogare folosit ca o expresie

Am nevoie pentru a obține acest rezultat în acest caz nu există nici o altă soluție pentru asta?

postgresql sql
2021-11-24 06:24:39
3
0

Eroarea vine de la faptul că, fie prima sau a doua subinterogare se întoarcă mai mult de 1 rand pentru dat property_id (550). Din comentariile tale

Le vreau pe toate, ca rezultat

Banuiesc ca ceea ce ai nevoie este lăsat să se alăture cu ambele tabele. Încercați acest lucru

select p.property_type, coalesce(fp.bedroom_count, pu.bedroom_count) as bedroom_count
  from properties p
  left join floor_plans fp 
    on p.property_type = 'APARTMENT_COMMUNITY' and fp.removed = false and fp.property_id = p.id
  left join property_units pu
    on p.property_type <> 'APARTMENT_COMMUNITY' and pu.removed = false and pu.property_id = p.id
 where p.id = 550
2021-11-24 06:50:23
0

Se pare ca tu chiar vrei să se alăture tabele. Ca vrei dormitor contează dintr-un tabel sau altul, deși, ar trebui să exterioare se alăture tabele.

select p.*, coalesce(fp.bedroom_count, pu.bedroom_count) as bedroom_count
from properties p
left join floor_plans fp on p.property_type = 'APARTMENT_COMMUNITY' 
                         and fp.property_id = p.id
                         and fp.removed = false 
left join property_units pu on p.property_type <> 'APARTMENT_COMMUNITY' 
                            and pu.property_id = p.id
                            and pu.removed = false 
where p.id = 550
order by p.id;

Sau de a folosi UNION ALL:

select p.*, fp.bedroom_count
from properties p
join floor_plans fp on fp.property_id = p.id and fp.removed = false 
where p.id = 550
and p.property_type = 'APARTMENT_COMMUNITY'
union all
select p.*, pu.bedroom_count
from properties p
join property_units pu on pu.property_id = p.id and pu.removed = false 
where p.id = 550
and p.property_type <> 'APARTMENT_COMMUNITY'
order by p.id;

(Dacă property_type poate fi null, aceste interogări va avea nevoie de unele ajustări de-a face cu asta.)

2021-11-24 06:51:04
0
select  case 
            when p.property_type ='APARTMENT_COMMUNITY' 
                then (  
                    select  array_agg(distinct fp.bedroom_count) 
                    from    floor_plans fp 
                    where   fp.removed = false 
                    and     fp.property_id=p.id ) 
            else (
                    select  (array_agg(distinct pu.bedroom_count)) 
                    from    property_units pu 
                    where   pu.removed = false 
                    and pu.property_id=p.id ) 
        end 
from    properties p 
where   p.id =550

acesta este răspunsul la problema mea in caz ca cineva are nevoie de ea

2021-11-24 07:43:36

Bine, așa că este într-adevăr o agregare ați fost în căutarea pentru. Data viitoare vă pun o întrebare, te rog, arată date eșantion și rezultatul așteptat, așa că am înțeles ceea ce se cere.
Thorsten Kettner

da îmi pare rău ,aceasta este prima mea timp )))) multumesc mult voi
Grigor Martiros

Am învățat o mulțime de raspunsul tau oricum
Grigor Martiros

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................