Jak vrátit více než jeden řádek z poddotazu použít jako výraz

0

Otázka

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

Mám to,bedroom_count není jeden řádek,takže to dává tuto chybu

CHYBA: více než jeden řádek vrácené poddotazem používá jako výraz

Musím se dostat, že výsledek v tomto případě existuje nějaké jiné řešení?

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

Chyba vychází z faktu, že buď první nebo druhý poddotaz vrátí více než 1 řádek pro danou property_id (550). Z vašeho komentáře

Chci všechny z nich jako výsledek

Hádám, že to, co potřebujete, je left join s oběma stoly. Zkuste to

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

To zní, jako byste opravdu chcete připojit tabulky. Jak chcete, ložnice se počítá z jedné tabulky nebo jiné, i když, budete muset vnější spojení tabulek.

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;

Nebo použít 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;

(Pokud property_type může být null, tyto dotazy bude potřebovat nějaké úpravy, aby se s tím vypořádat.)

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

tohle je odpověď na můj problém v případě, že někdo potřebuje

2021-11-24 07:43:36

Dobře, tak to je opravdu agregace, které jste hledali. Příště si položit otázku, prosím, ukaž vzorek dat a očekávaný výsledek, a tak jsme se pochopit, co žádáte.
Thorsten Kettner

jo promiň ,tohle je můj první čas )))) díky moc, budu
Grigor Martiros

Naučil jsem se hodně z vaší odpovědi stejně
Grigor Martiros

V jiných jazycích

Tato stránka je v jiných jazycích

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