Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过3个表联接并根据这些表的内容检索字段_Sql_Postgresql - Fatal编程技术网

Sql 通过3个表联接并根据这些表的内容检索字段

Sql 通过3个表联接并根据这些表的内容检索字段,sql,postgresql,Sql,Postgresql,有点难以解释,所以我会把它画出来。考虑到这四个表格:房屋、业主房屋、公司和承租人,我需要找到过去14天内所有已注册的房屋,并获得有关它们的一些信息 之前,我通过一个非常简单的从houses表中选择查询完成了这项工作。但现在我需要让房子的出租人在报告上展示。问题是,出租代理可以位于3个位置中的任意一个:公司表、房屋表或租户表。到目前为止,我提出了以下问题: select distinct h.id as id, h.address1 as address1, h.town as t

有点难以解释,所以我会把它画出来。考虑到这四个表格:房屋、业主房屋、公司和承租人,我需要找到过去14天内所有已注册的房屋,并获得有关它们的一些信息

之前,我通过一个非常简单的从houses表中选择查询完成了这项工作。但现在我需要让房子的出租人在报告上展示。问题是,出租代理可以位于3个位置中的任意一个:公司表、房屋表或租户表。到目前为止,我提出了以下问题:

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
这种方法是有效的,但是我得到的结果是一个空的代理字段,即使它的意思是说未知尚未设置。即使我使用了不同的h.id,我也会得到重复的房子。我认为这是因为公司、房屋和租户表中有多个房屋出租代理

查询中需要更改哪些内容才能使其正常工作


谢谢。

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

COALESCE(c.name, h.letting_agent, t.letting_agent, 'Unknown (Not set yet)') as Agent
这将检查c.name。如果为null,则移动到下一个参数并执行相同的操作


查询中的所有其他内容看起来都很好,这在postgresql中确实有效。

Distinct仅使每个元组都是唯一的,而不是元组中的每个值。我从未尝试过psql,但也许该语言支持coalesce函数?它返回第一个非空值。例如,coalescc.name、h.letting_Agent、t.letting_Agent、'Unknown Not set yet'刚刚尝试过,给了我与CASE函数完全相同的输出,我仍然有空的代理字段和重复的房屋。更整洁,但不太整洁!那么一栋房子可能有多个出租代理?也许可以尝试将c limit 1中的SELECT c.name合并到Coalesca房屋中,该房屋可以有一个出租代理,但其定义可能不同。一家公司可以拥有一所房子,因此出租代理将是存储在公司表中的公司名称,或者当租户注册时,他们可以为出租代理输入不同的值,例如存储在租户表中的怀特先生、怀特先生、怀特先生。。。我基本上需要把它作为一种偏好,首先从公司表中,如果没有,从房屋表中,然后从房屋的一个租户那里。如果我不能从所有3个中得到结果,那么显示Unknown。是的,这就是Coalesce函数的作用。它从左到右检查每个参数,并使用第一个非空值。如果它们都为NULL,则使用“Unknown”,可能会改为删除distinct并按h.id分组。还要确保代理字段允许空值,并在为空时设置为空值,而不是或其他值