Sql 检查其他表中是否不存在该值
你好,我有以下问题 我有这个ER图 我需要选择在发表博士论文的那一年中没有发表期刊或会议论文的所有人。我的问题是,当我只检查他是否没有发表论文时,我做到了这一点,但当我两者都失败时,我错了什么Sql 检查其他表中是否不存在该值,sql,postgresql,entity-relationship,Sql,Postgresql,Entity Relationship,你好,我有以下问题 我有这个ER图 我需要选择在发表博士论文的那一年中没有发表期刊或会议论文的所有人。我的问题是,当我只检查他是否没有发表论文时,我做到了这一点,但当我两者都失败时,我错了什么 Select count(akey) from persons WHERE (Select theses.year from persons inner join theses on persons.akey = theses.akey Where
Select count(akey)
from persons
WHERE (Select theses.year
from persons
inner join theses on persons.akey = theses.akey
Where theses.type = 'PhD') not in ((Select year
from persons
inner join authpapers on persons.akey = authpapers.akey
inner join papers on authpapers.pkey = papers.pkey
inner join journals on journals.jkey = papers.jkey)
and (Select year
from persons
inner join authpapers on persons.akey = authpapers.akey
inner join papers on authpapers.pkey = papers.pkey
inner join conferences on conferences.ckey = papers.ckey));
它说从not in开始的部分不是布尔类型,但我应该如何使它成为布尔类型?您的not in子句基本上减少到not in查询结果期刊和查询结果论文中。它试图删除和两个查询结果,这不是您想要的,这就是为什么您会得到一个非布尔错误。您应该将and替换为UNION或UNION ALL,这将两个查询结果合并为一个,然后将在NOT in子句中工作
Select count(akey)
from persons
WHERE (Select theses.year
from persons
inner join theses on persons.akey = theses.akey
Where theses.type = 'PhD') not in ((Select year
from persons
inner join authpapers on persons.akey = authpapers.akey
inner join papers on authpapers.pkey = papers.pkey
inner join journals on journals.jkey = papers.jkey)
UNION (Select year
from persons
inner join authpapers on persons.akey = authpapers.akey
inner join papers on authpapers.pkey = papers.pkey
inner join conferences on conferences.ckey = papers.ckey));
您的NOT IN子句基本上减少为NOT IN查询结果日志和查询结果论文。它试图删除和两个查询结果,这不是您想要的,这就是为什么您会得到一个非布尔错误。您应该将and替换为UNION或UNION ALL,这将两个查询结果合并为一个,然后将在NOT in子句中工作
Select count(akey)
from persons
WHERE (Select theses.year
from persons
inner join theses on persons.akey = theses.akey
Where theses.type = 'PhD') not in ((Select year
from persons
inner join authpapers on persons.akey = authpapers.akey
inner join papers on authpapers.pkey = papers.pkey
inner join journals on journals.jkey = papers.jkey)
UNION (Select year
from persons
inner join authpapers on persons.akey = authpapers.akey
inner join papers on authpapers.pkey = papers.pkey
inner join conferences on conferences.ckey = papers.ckey));
只是为了展示另一种选择:你可以收集所有论文、会议和期刊的出版物,然后汇总到一起,找到在一年内发表论文和会议或期刊的人
with published as
(
select akey, type, year from theses where type = 'PhD'
union all
select ap.akey, 'conference', c.year
from authpapers ap
join papers p on p.pkey = ap.pkey
join conferences c on c.ckey = p.ckey
union all
select ap.akey, 'journal', j.year
from authpapers ap
join papers p on p.pkey = ap.pkey
join journals j on c.jkey = p.jkey
)
select *
from persons
where akey in
(
select akey
from published
group by akey, year
having bool_or(type = 'PhD')
and not ( bool_or(type = 'conference') or bool_or(type = 'journal') )
)
order by akey;
聚合bool_或至少可以读取为一个或任意一个
我们不知道您的数据库是否允许发布与Journal和conference相同的论文。或者一个人是否可以有多篇博士论文,也许是几次尝试?。上面的查询查看了一个人发表某个东西的所有年份,如果它发现一个人至少发表了一年的博士论文和期刊或会议,它会显示该人。只是为了显示另一种选择:你可以收集所有发表论文的出版物,会议和期刊,然后汇总,找出在一年内发表论文的人以及会议或期刊
with published as
(
select akey, type, year from theses where type = 'PhD'
union all
select ap.akey, 'conference', c.year
from authpapers ap
join papers p on p.pkey = ap.pkey
join conferences c on c.ckey = p.ckey
union all
select ap.akey, 'journal', j.year
from authpapers ap
join papers p on p.pkey = ap.pkey
join journals j on c.jkey = p.jkey
)
select *
from persons
where akey in
(
select akey
from published
group by akey, year
having bool_or(type = 'PhD')
and not ( bool_or(type = 'conference') or bool_or(type = 'journal') )
)
order by akey;
聚合bool_或至少可以读取为一个或任意一个
我们不知道您的数据库是否允许发布与Journal和conference相同的论文。或者一个人是否可以有多篇博士论文,也许是几次尝试?。上面的查询查看了一个人发表某个东西的所有年份,如果它发现一个人至少发表了一年的博士论文、期刊或会议,则显示该人。如果可以使用exists,则无需计算
如果可以使用exists,则无需计数
一个提示:ExistsA查询的主要问题是从子查询中选择的人与主查询中的人不相关。一个提示:ExistsA查询的主要问题是从子查询中选择的人与主查询中的人不相关。