我试图在Postgres中将几个表中的一些用户数据混合在一起,以便在网页上的表格中显示信息。用户可能有也可能没有"联系"信息,我试图包括"联系人"电子邮件地址作为选择查询中返回的内容的一部分。
我使用的查询归结为以下内容:
select u.user_id, r.role_id, u.first_name, u.last_name, c.email, o.state_active, ce.name
from user
join user_role r on u.user_id = r.user_id
join company c on r.company_id = c.company_id
join object_state o on u.state_id = o.state_id
left outer join user_contact uc on u.user_id = uc.user_id and uc.default_flag = 'Y' and uc.status = 'A'
left outer join contact c on uc.contact_id = c.contact_id and c.contact_type like 'E%'
我一直遇到底部外部连接表周围的问题。看来,如果我执行SELECT *类型的查询,我会收回我期望的所有内容,但是只要我运行上面的查询,语句就会挂起并且永远不会返回值。但是,如果我删除了select语句的c.email部分,那么一切都会很快返回,没有任何问题。
我是否遗漏了Postgres的某些核心功能,我无法选择可能为null的列,或者是否有其他显而易见的信息,我完全不知道这个查询是什么?如果我不需要电子邮件,我不明白为什么它可以正常工作,但不是这样。
答案 0 :(得分:0)
您是否可以提供sqlfiddle数据库样本来测试我们的解决方案?
你可以试试这个:
select u.user_id, r.role_id, u.first_name, u.last_name, COALESCE(c.email,NULL), o.state_active, ce.name
from user
join user_role r on u.user_id = r.user_id
join company c on r.company_id = c.company_id
join object_state o on u.state_id = o.state_id
left outer join user_contact uc on u.user_id = uc.user_id and uc.default_flag = 'Y' and uc.status = 'A'
left outer join contact c on COALESCE(uc.contact_id,-1) = c.contact_id and c.contact_type like 'E%'
在这里,您应该查看COALESCE
。