我有这个问题:
我有两个主要的桌子(公寓,租户)有一个连接到许多(一个公寓,许多租户)。
我想把我所有的公寓都搬走,但是和他的一个房客在一起。
优先承租人是ot=2的承租人(有2个可能值:1或2)。
我试图使用子查询,但在postgresql中,它不允许您返回超过1列。
我不知道怎么解决。这是我的最新代码:

SELECT a.apartment_id, a.apartment_num, a.floor, at.app_type_desc_he, tn.otype_desc_he, tn.e_name
FROM
  public.apartments a INNER JOIN public.apartment_types at ON
  at.app_type_id = a.apartment_type INNER JOIN
    (select t.apartment_id, t.building_id, ot.otype_id, ot.otype_desc_he, e.e_name
     from   public.tenants t INNER JOIN public.ownership_types ot ON
        ot.otype_id = t.ownership_type INNER JOIN entities e ON
        t.entity_id = e.entity_id
     ) tn ON
  a.apartment_id = tn.apartment_id AND tn.building_id = a.building_id
WHERE
  a.building_id = 4 AND tn.building_id=4
ORDER BY
  a.apartment_num ASC,
  tn.otype_id DESC

提前付款

最佳答案


SELECT a.apartment_id, a.apartment_num, a.floor
      ,at.app_type_desc_he, tn.otype_desc_he, tn.e_name
FROM   public.apartments a
JOIN   public.apartment_types at ON at.app_type_id = a.apartment_type
LEFT JOIN  (
    SELECT t.apartment_id, t.building_id, ot.otype_id
          ,ot.otype_desc_he, e.e_name
    FROM   public.tenants t
    JOIN   public.ownership_types ot ON ot.otype_id = t.ownership_type
    JOIN   entities e ON t.entity_id = e.entity_id
    ORDER  BY (ot.otype_id = 2) DESC
    LIMIT  1
    ) tn ON (tn.apartment_id, tn.building_id)=(a.apartment_id, a.building_id)
WHERE  a.building_id = 4
AND    tn.building_id = 4
ORDER  BY a.apartment_num;  -- , tn.otype_id DESC -- pointless

重点强调了关键部分。
这两种情况下都有效。
如果有租客住一套公寓,正好有一个会被退。
如果有一个(或多个)租户属于ot.otype_id = 2,则它将是该类型的租户之一。
如果没有房客,那房子还是要还的。
如果,对于ot.otype_id。。。
有两个可能的值:1或2
... 您可以简化为:
ORDER  BY ot.otype_id DESC

调试查询
尝试从基查询中删除WHERE子句并更改
JOIN   public.apartment_types


LEFT JOIN   public.apartment_types

并逐个将它们添加回去,以查看哪个条件排除了所有行。
at.app_type_ida.apartment_type真的匹配吗?

关于sql - 从联接(1到多)postgresql中接收1行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11280151/

10-11 17:22