Comment renvoyer plus d'une ligne de sous-requête utilisé comme expression

0

La question

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

J'ai cette,bedroom_count n'est pas une seule ligne,de sorte qu'il donne cette erreur

ERREUR: plus d'une ligne renvoyée par une sous-requête en tant qu'expression

J'ai besoin d'obtenir ce résultat dans ce cas est-il une autre solution pour cela?

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

L'erreur vient du fait que la première ou à la deuxième sous-requête retourne de plus de 1 ligne pour les property_id (550). Vos commentaires

J'ai envie de tous les avoir comme résultat

Je devine que ce que vous avez besoin est une jointure gauche avec les deux tables. Essayez ceci

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

Il semble que vous voulez vraiment pour joindre les tables. Comme vous voulez que la chambre compte à partir d'une table ou de l'autre, cependant, vous devez jointure de tables.

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 de l'utilisation 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;

(Si property_type peut être null, ces requêtes aura besoin d'un peu d'ajustement à faire avec.)

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

c'est la réponse à mon problème dans le cas où quelqu'un en a besoin

2021-11-24 07:43:36

Ok, donc c'est en effet une agrégation que vous recherchez. La prochaine fois vous poser une question, s'il vous plaît montrer échantillon de données et de résultats attendus, de sorte que nous comprenons ce que vous demandez.
Thorsten Kettner

ouais désolé ,c'est ma première fois )))) merci beaucoup, je vais
Grigor Martiros

J'ai appris beaucoup de votre réponse de toute façon
Grigor Martiros

Dans d'autres langues

Cette page est dans d'autres langues

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