Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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 检查其他表中是否不存在该值_Sql_Postgresql_Entity Relationship - Fatal编程技术网

Sql 检查其他表中是否不存在该值

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

你好,我有以下问题

我有这个ER图

我需要选择在发表博士论文的那一年中没有发表期刊或会议论文的所有人。我的问题是,当我只检查他是否没有发表论文时,我做到了这一点,但当我两者都失败时,我错了什么

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查询的主要问题是从子查询中选择的人与主查询中的人不相关。