【问题标题】:How do I return a value of an entity in a table that is less than but closest to the value in another table for each element in the last table in SQL?如何为 SQL 中最后一个表中的每个元素返回一个表中的实体值,该值小于但最接近另一个表中的值?
【发布时间】:2014-07-27 01:59:56
【问题描述】:

我在 MS Access 中有两个表,我正在尝试为其中一个表添加一个字段,该字段告诉另一个表中的哪条记录的值小于第一个字段的值,但最接近?到目前为止,我有这个查询(只是一个用于测试输出而不更改现有表的 select 语句),但它列出了所有小于查询值的值:

SELECT JavaClassFileList.ClassFile, ModuleList.Module
FROM JavaClassFileList, ModuleList
WHERE ModuleList.Order<JavaClassFileList.Order;`  

我尝试使用SELECT JavaClassFileList.Classfile, MAX(ModuleList.Module) 之类的东西,它只会显示最大模块,但将它与上面的 select 语句结合起来,但它会说它只会返回一条记录。

期望的输出:我有一些记录,a、b 和 c,我将调用它们,每个记录存储各种信息,而 a 在列中存储值 732,b 在列中存储值 731同一列。 c 存储的值是 720。在另一个表中,d 存储的值是 730,e 存储的值是 718。我想要这样的输出(它们从大到小排序):

  • a 732 d 730
  • b 731 d 730
  • c 720 e 718

右边可以有重复,但左边不能有重复。我怎样才能得到这个结果?

【问题讨论】:

  • 不幸的是,您的大部分问题都是噪音。询问 SQL 查询时要添加的重要内容是:表结构(包括主键和外键约束)以及您想要完成的确切内容(最好使用示例数据和所需结果)。
  • 主键是 JavaClassFileList 的 ClassFile、ModuleList 的 Module 和 FunctionMethodList 的 Method。我没有指定任何外键约束,因为我认为没有必要这样做,因为这只是组织现有数据并以更有用的形式呈现。 JavaClassFileList 中的外键是 ModuleMembership(使用 ModuleList 中的 Module,但如上述问题中所述)。最初,数据库只是一个包含所有内容列表的表(无论它是方法、类还是模块)。它们是根据它们在原始表中的顺序进行编号的。
  • 示例结果:在 JavaClassFileList 中,前两个类文件的 Order 分别等于 725 和 720。这两个类都属于同一个模块。该模块的 Order 等于 719,之后的一个等于 713。我想为这两个类返回最接近的模块,其顺序小于类的 order 值。
  • 当您使用SELECT JavaClassFileList.Classfile, MAX(ModuleList.Module) 时,您是否也使用了GROUP BY JavaClassFileList.Classfile?如果是这样,那么您不应该只有一行,而是每个 classFile 一行,这似乎是所需的结果。

标签: sql ms-access ms-access-2010


【解决方案1】:

我假设 Order 对于 Module 来说是唯一的。如果不是,JavaClassFileRecords 可能会在结果集中出现多次。

如果没有为 JavaClassFile 找到模块,则它不会显示在结果中。如果您确实希望它出现在这种情况下(使用空模块),请将INNER JOIN 替换为LEFT OUTER JOIN

SELECT j.ClassFile, m.Module
FROM JavaClassFileList j
INNER JOIN ModuleList m
ON m.Order =
    (SELECT MAX(Order)
     FROM ModuleList
     WHERE Order < j.Order)

【讨论】:

  • 这对我不起作用,因为语法未被识别或与另一个查询结合时产生奇怪的结果。请参阅我稍后在此问题之后提出的问题(这基本上是对该问题的重新措辞和不同的呈现方式),以了解我发现的答案最有帮助。
  • 不过这是个好主意。我在不同的数据库中尝试过,效果很好。不知道为什么它在另一个上对我不起作用,认为部分原因是表格的复制粘贴性质,因为它来自 excel。
【解决方案2】:

我会使用相关子查询来处理这种类型的查询。我在Access中想到了以下几个字:

SELECT jc.ClassFile,
       (select top 1 ml.Module
        from ModuleList as ml
        where ml.[Order] < jc.[Order]
       )
FROM JavaClassFileList as jc;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2021-03-15
    • 1970-01-01
    • 2010-11-13
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多