Jak odzyskać więcej niż jeden wiersz z podrzędnego, używanego jako wyrażenia

0

Pytanie

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

Mam to,bedroom_count-to nie jest jeden wiersz,więc wydaje ten błąd

BŁĄD: więcej niż jeden wiersz, zwracanej подзапросом, używanych jako wyrażenia

Muszę uzyskać wynik ten w takim razie, czy istnieje jakieś inne rozwiązanie tego problemu?

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

Błąd wynika z tego, że pierwszy lub drugi podzapytanie zwraca ponad 1 wiersze dla określonego identyfikatora właściwości (550). Z twoich komentarzy

Chcę, aby wszystkie one były wynikiem

Myślę, że trzeba dołączyć do obu stołów. Spróbuj 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

Wygląda na to, naprawdę chcesz dołączyć do stołów. Jednak, jeśli chcesz, aby sypialnia była z jednego stołu lub z innego, trzeba będzie dołączyć do stołów na zewnątrz.

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;

Lub użyć 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;

(Jeśli property_type może być równy zero, wnioski te wymagają pewnej korekty, aby sobie z tym poradzić.)

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

to jest odpowiedź na mój problem na wypadek, jeśli ktoś będzie potrzebował

2021-11-24 07:43:36

Dobrze, to znaczy, że to naprawdę jest agregacja, którą szukasz. Następnym razem, gdy zadasz pytanie, proszę pokazać przykładowe dane i oczekiwany wynik, abyśmy zrozumieli, o co pytasz.
Thorsten Kettner

tak, przepraszam ,to mój pierwszy raz )))) bardzo dziękuję, będę
Grigor Martiros

W każdym razie, wiele się nauczyłem z twojej odpowiedzi
Grigor Martiros

W innych językach

Ta strona jest w innych językach

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