【问题标题】:NOT EXIST not returning any rowsNOT EXIST 不返回任何行
【发布时间】:2019-04-04 18:57:27
【问题描述】:

我有以下 SQL 查询

select distinct fnamn,enamn,pubdatum
from author,book
where pubdatum <'1961-0-0 AND author.enamn=book.forfattarenamn;

这很好,它显示了在 1961 年之前出版的所有作者,但是如果我只想要 1961 年之前而不是之后出版的作者怎么办?

我想过像这样添加一个 NOT EXISTS

select distinct fnamn,enamn,pubdatum
from author,book
where pubdatum <'1961-0-0' AND author.enamn=book.forfattarenamn
AND NOT EXISTS
(select distinct fnamn,enamn,pubdatum
from author,book
where pubdatum >='1961-0-0' AND author.enamn=book.forfattarenamn);

因此,在子查询中,它列出了 1961 年之后发表的所有作者。据我了解,现在这会将这些作者从原始查询中删除。但运行此 SQL 语句不会返回任何行。我是否误解了 NOT EXISTS?

【问题讨论】:

  • 您的 NOT EXISTS 子查询需要外部表条件。
  • 就目前而言,您NOT EXISTS 是“没有作者自 1961 年以来发表过一本书”,而不是“作者没有发表过自 1961 年以来的书”。
  • 为什么不只是介于两者之间? stackoverflow.com/questions/23398632/…
  • 因为它不排除在 1961 年之前出版了一本书并且在 1961 年之后又出版了第二本书的作者。
  • 我如何给它外部表条件? @jarlh

标签: sql


【解决方案1】:

如果我只想要 1961 年之前而不是 1961 年之后发表的作者怎么办?

一个简单的方法使用group byhaving

select a.fnamn, a.enamn, max(b.pubdatum)
from author a inner join
     book b 
     on a.enamn = b.forfattarenamn
group by a.fnamn, a.enamn
having max(b.pubdatum) < '1961-01-01';

【讨论】:

    【解决方案2】:

    你可以这样做(请在ID中插入作者的PK):

    select distinct a.fnamn,a.enamn,b.pubdatum
    from author as a
    inner join book as b ON a.enamn=b.forfattarenamn
    where b.pubdatum <'1961-0-0'
    AND NOT EXISTS
    (select 0
    from author as aX
    inner join book as bX on ax.enamn=bx.forfattarenamn
    where bx.pubdatum >='1961-0-0' AND aX.ID = a.ID);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多