您将如何用外行术语解释这个查询?

Posted

技术标签:

【中文标题】您将如何用外行术语解释这个查询?【英文标题】:How would you explain this query in layman terms? 【发布时间】:2018-05-21 05:50:09 【问题描述】:

这是我正在使用的数据库:https://drive.google.com/file/d/1ArJekOQpal0JFIr1h3NXYcFVngnCNUxg/view?usp=sharing

select distinct 
    AC1.givename, AC1.famname, AC2.givename, AC2.famname
from 
    academic AC1, author AU1, academic AC2, author AU2
where 
    AC1.acnum = AU1.acnum
    and AC2.acnum = AU2.acnum
    and AU1.panum = AU2.panum
    and AU2.acnum > AU1.acnum
    and not exists (select *
                    from Interest I1, Interest I2
                    where I1.acnum = AC1.acnum
                      and I2.acnum = AC2.acnum);

输出: 我无法用外行术语(普通英语)解释子查询和查询的输出。

不确定我的解释是否正确:

"子查询查找两个作者没有共同感兴趣的领域的感兴趣的领域。

整个查询查找至少有两位作者且没有共同兴趣领域的论文作者的名字和姓氏。"

【问题讨论】:

我认为这个查询没有多大意义。子查询无法执行与I1I2 相关的任何操作。当然,如果查询的作者赶上了 ANSI-1992 版本的 SQL 语言并使用显式连接而不是逗号连接,那么查询的意图可能会更清楚。我知道,他们只有 四分之一个世纪 来了解这一点 :-( Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它 你说“没有共同的兴趣领域”。然后我猜测 NOT EXISTS 也应该加入 I1.FIELD = I2.FIELD 【参考方案1】:

就目前而言,如果每个学者至少有一个兴趣,子查询将生成行。

因此,总体而言,查询是“产生一对学者,他们共同撰写了至少一篇论文,并且其中至少有一个没有任何兴趣”。很难相信这就是我们的意图,如果是这样,还有更清晰的书写方式可以更清楚地表明这就是我们正在寻找的。​​p>

如果这是我们想要的查询,我会写成:

SELECT
    AC1.givename, AC1.famname, AC2.givename, AC2.famname
FROM
    academic AC1
       inner join
    academic AC2
       on
          AC1.acnum < AC2.acnum
WHERE EXISTS
    (select * from author au1 inner join author au2 on au1.panum = au2.panum
     where au1.acnum = ac1.acnum and au2.acnum = ac2.acnum)
AND
    (
    NOT EXISTS (select * from interest i where i.acnum = ac1.acnum)
    OR
    NOT EXISTS (select * from interest i where i.acnum = ac2.acnum)
    )

如果更可能的是,我们想要一对没有共同兴趣的共同作者,我们会这样写:

SELECT
    AC1.givename, AC1.famname, AC2.givename, AC2.famname
FROM
    academic AC1
       inner join
    academic AC2
       on
          AC1.acnum < AC2.acnum
WHERE EXISTS
    (select * from author au1 inner join author au2 on au1.panum = au2.panum
     where au1.acnum = ac1.acnum and au2.acnum = ac2.acnum)
AND NOT EXISTS
    (select * from interest i1 inner join interest i2 on i1.field = i2.field
     where i1.acnum = ac1.acnum and i2.acnum = ac2.acnum)

注意我的两个查询都没有使用distinct,因为我们确保外部查询没有加入我们只关心存在的其他行> 或 不存在 这些行 - 我们已将所有此类检查移至 EXISTS 子查询中。

我通常看到distinct 在作者获得多个结果时过于频繁地使用,而他们只想要一个结果并且他们不愿意花费精力去发现他们得到的为什么多个结果。在这种情况下,可能是同一对学者共同撰写了不止一篇论文。

【讨论】:

以上是关于您将如何用外行术语解释这个查询?的主要内容,如果未能解决你的问题,请参考以下文章

任何人都可以用外行术语解释,当使用域名打开我的网站时,它显示 https,但使用静态 IP,它显示 http。为啥?

用外行术语来说,pytorch 中的聚集函数有啥作用?

外行术语中的 Spring 传播示例

word2vec:负采样(外行术语)?

什么是 PHP 中的 Closures/Lambda 或 Javascript 中的外行术语? [复制]

基本链表类型队列,在 Java + 请求外行术语中扩展了一个非常基本的 Node<T>