【问题标题】:Difference list vs INTERSECT across multiple tables跨多个表的差异列表与 INTERSECT
【发布时间】:2015-08-26 10:36:35
【问题描述】:

对于给定的数据库数据结构:

Table      Attribute       Type                       Glossary

Species    Sp_name         C(10) P.K.                 Species name
           sp_woodtype     C(10)                      Wood Yielded by tree
           sp_maxht        I                          Max.height


Forest     Fo_name         C(10) P.K.                 Forest name
           Fo_size         I                          Forest area
           Fo loc          C(10)                      Geographical name
           Fo_comp         C(10)                      Forest owner


Tree       Tr_species      C(10) F.K. species.sp_name
           Tr_forest       C(10) F.K. forest.fo_name
           Tr_numb         I     P.K.                 Sequence number
           Tr_planted      Date                       Date of planting
           Tr_loc          C(10)                      Forest quadrant
           Tr_parent       I     F.K. tree.tr_numb    Procreating tree reference


Measure    Me_trnumb       I     F.K. tree.tr_numb
           Me_numb         I     P.K.                 Sequence number
           Me_result       I                          Test's measure
           Me_date         Date                       Measure taken on 
           Me_type         C(10)                      Type of measure

PK是主键,F.K.为外键,C(N) Character(N)类型,I Integer类型

我需要选择在所有森林中都发现了哪些树种,所以我尝试了以下方法,但似乎错误:

SELECT fo_name.forest, sp_name.species
FROM forest, species;

SELECT tr_species.tree, tr_forest.tree
FROM tree;

SELECT fo_name.forest, sp_name.species
FROM forest, species
INTERSECT
SELECT tr_species.tree, tr_forest.tree
FROM tree;

在解决这个问题时,差异列表是否比 INTERSECT 更好?

【问题讨论】:

  • 如果这是一道考试题,你应该自己解决。无论哪种情况,INTERSECT 都不是解决方案。据我了解这个问题,您应该提供一份物种清单,每个物种都存在于所有森林中。因此,如果您在表“森林”中有 10 条记录,则在表“树”中找到存在于 10 个不同森林中的那些“tr_species”。在“树”上应用合适的聚合函数,然后将JOIN 应用于“物种”。交给你了。
  • 这是3年前的考试题。万一你错过了,我说修改
  • 从这个问题中你有什么不明白的地方?有数据库,问题是在所有森林中都发现了哪些树种?
  • 关闭原因似乎不正确。我很清楚要问什么。
  • 它以作为家庭作业的下意识反应而结束,因为它相当广泛,而不是专注于特定的技术方面。我进行了编辑以将其重点放在技术方面并重新投票。祝你考试顺利。

标签: sql sql-server oracle postgresql relational-division


【解决方案1】:

这是关系除法的一种特殊情况。
您可以将每棵树的不同森林数量与森林总数进行比较,以了解:

SELECT tr_species
FROM   tree
GROUP  BY tr_species
HAVING count(DISTINCT tr_forest) = (SELECT count(*) FROM forest);

如果您需要的不仅仅是 PK,请将结果加入表 species

顺便说一句,character(10) 的数据类型不好,尤其不能作为 PK 列。

【讨论】:

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