Как вернуть более одной строки из подзапроса, используемого в качестве выражения

0

Вопрос

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

У меня есть это,bedroom_count-это не одна строка,поэтому она выдает эту ошибку

ОШИБКА: более одной строки, возвращаемой подзапросом, используемым в качестве выражения

Мне нужно получить этот результат в таком случае, есть ли какое-либо другое решение для этого?

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

Ошибка возникает из-за того, что первый или второй подзапрос возвращает более 1 строки для заданного идентификатора свойства (550). Из ваших комментариев

Я хочу, чтобы все они были результатом

Я предполагаю, что вам нужно присоединиться к обоим столам. Попробуйте это

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

Похоже, вы действительно хотите присоединиться к столам. Однако, если вы хотите, чтобы спальня считалась с одного стола или с другого, вам придется присоединиться к столам снаружи.

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;

Или использовать 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;

(Если property_type может быть равен нулю, эти запросы потребуют некоторой корректировки, чтобы справиться с этим.)

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

это ответ на мою проблему на случай, если она кому-то понадобится

2021-11-24 07:43:36

Хорошо, значит, это действительно агрегация, которую вы искали. В следующий раз, когда вы зададите вопрос, пожалуйста, покажите примерные данные и ожидаемый результат, чтобы мы поняли, о чем вы спрашиваете.
Thorsten Kettner

да, извините ,это мой первый раз )))) большое спасибо, я буду
Grigor Martiros

В любом случае, я многому научился из твоего ответа
Grigor Martiros

На других языках

Эта страница на других языках

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

Популярное в этой категории

Популярные вопросы в этой категории