我有这个问题:
我有两个主要的桌子(公寓,租户)有一个连接到许多(一个公寓,许多租户)。
我想把我所有的公寓都搬走,但是和他的一个房客在一起。
优先承租人是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_id
和a.apartment_type
真的匹配吗?关于sql - 从联接(1到多)postgresql中接收1行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11280151/