加入3个表并根据这些表的内容检索字段

时间:2013-07-18 14:22:06

标签: sql postgresql

有点难以解释,所以我会把它映射出来。鉴于以下四个表:houseslandlord_housescompanytenant,我需要查找过去14天内已注册的所有房屋并获取有关的信息它们。

之前我使用select表中的一个非常简单的houses查询完成了此操作。但现在我需要让房子的租赁代理人在报告上显示。问题是,letting代理可以位于3个位置中的任何一个位置:company表,houses表或tenant表中。到目前为止,我已经提出了这个问题:

select distinct h.id as id,
    h.address1 as address1,
    h.town as town,
    h.postcode as postcode,
    h.valid_from as valid_from,
    h.valid_to as valid_to,
    (CASE WHEN c.name IS NOT NULL THEN c.name || ' (MS)'
      WHEN h.letting_agent IS NOT NULL THEN h.letting_agent
      WHEN t.id IS NOT NULL THEN t.letting_agent
      ELSE 'Unknown (Not set yet)' END) AS agent
from houses h
left join landlord_houses lh on lh.house_id = h.id
left join company c on c.id = lh.company_id
left join tenant t on t.house_id = h.id
where h.deleted IS FALSE
and h.archived IS FALSE
and h.sign_up_complete IS TRUE
and h.completed > NOW() - '14 days'::INTERVAL
order by h.id

这种作品,但是我得到的结果是空的agent字段,即使它意味着说“未知(尚未设置)”。即使我使用distinct h.id,我也会收到重复的房屋。我认为这是因为公司,房屋和租户桌中有多个租赁代理商。

在查询中需要更改哪些内容才能使其生效?

谢谢。

1 个答案:

答案 0 :(得分:-1)

那个案例陈述看起来有点不稳定。您可能会返回多个值。试试这个:

COALESCE(c.name, h.letting_agent, t.letting_agent, 'Unknown (Not set yet)') as Agent

这会检查c.name。如果为null,则移至下一个参数并执行相同操作。

查询中的其他所有内容看起来都很好,这在postgresql中也可以。