首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在一个查询中选择with JOIN and condition和with with JOIN

在一个查询中选择with JOIN and condition和with with JOIN
EN

Stack Overflow用户
提问于 2019-08-22 13:22:29
回答 2查看 64关注 0票数 0

在PostgreSQL中,我有两个表:

company id名称

owner company_id已验证

在没有关联company的情况下,没有owner记录出现在数据库中。

但是我们有company记录,在没有owner的DB中呈现。

如何一次查询选择所有只有验证所有者的公司和没有验证所有者的公司?

我已经尝试了许多查询,但没有人在工作:(

例如,以下查询不起作用:

代码语言:javascript
代码运行次数:0
运行
复制
select count(c.id) 
from company as c 
  left outer join owner o on c.id = o.company_id and o.verified is not null 
where not (c.id = o.company_id and o.verified is null);

示例模式

http://sqlfiddle.com/#!17/ab366

代码语言:javascript
代码运行次数:0
运行
复制
create table company (
  id int unique,
  name varchar(255)
);

create table owner (
  first_name varchar(255),
  company_id int unique references company(id) on update cascade on delete set null,
  verified boolean
);

insert into company values (1, 'company1');
insert into company values (2, 'company2');
insert into company values (3, 'company3');

insert into owner values ('owner1', 1, true);
insert into owner values ('owner2', 2, false);

我需要选择company1company3

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-22 13:26:14

在这里,我将实际使用从company表到owner表的左连接:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT c.*
FROM company c
LEFT JOIN owner o
    ON c.id = o.company_id
WHERE
    o.company_id IS NULL OR    -- companies without owners
    o.verified IS NOT NULL;    -- companies with verified owners
票数 4
EN

Stack Overflow用户

发布于 2019-08-22 20:11:29

我将在where子句中使用过滤:

代码语言:javascript
代码运行次数:0
运行
复制
select c.*
from companies c
where not exists (select 1
                  from owners o
                  where o.company_id = c.id and
                        not o.verified
                 );

这样做的主要原因是,如果有多个经过验证的所有者,left join版本可能会返回重复项。

第二个原因是这更紧密地捕捉到了您所描述的逻辑。。。你想要没有未经验证的所有者的公司。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57602510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档