Como retornar mais de uma linha a partir da subconsulta usado como expressão

0

Pergunta

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 tenho esse,bedroom_count não é uma única linha,por isso dá esse erro

ERRO: mais de uma linha retornada por uma subconsulta usado como uma expressão

Eu precisa para obter esse resultado, nesse caso, existe alguma outra solução?

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

O erro vem do fato de que em primeiro ou em segundo subconsulta retorna mais de 1 linha para determinado property_id (550). A partir de seus comentários

Eu quero todos eles como resultado

Eu estou supondo que o que você precisa é de left join com as tabelas. Tente isso

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

Parece que você realmente deseja associar as tabelas. Como você quer o quarto conta a partir de uma tabela ou outro, porém, você teria para o exterior associar as tabelas.

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;

Ou uso 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;

(Se property_type pode ser nulo, estas consultas vai precisar de alguns ajustes para lidar com isso.)

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

esta é a resposta para o meu problema, caso alguém precisa de ti

2021-11-24 07:43:36

Ok, então isso é, de fato, uma agregação que você estava procurando. Próxima vez que você fizer uma pergunta, por favor, mostrar dados de exemplo e resultado esperado, por isso, compreender o que você está pedindo.
Thorsten Kettner

sim, desculpe ,essa é a minha primeira vez )))) muito obrigado eu vou
Grigor Martiros

Eu aprendi muito de sua resposta, de qualquer maneira
Grigor Martiros

Em outros idiomas

Esta página está em outros idiomas

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