【问题标题】:Select max date from table when joining multiple tables加入多个表时从表中选择最大日期
【发布时间】:2020-12-20 01:53:21
【问题描述】:

我正在尝试编写一个查询来检索最大调度日期,并从多个表中引入字段。我使用其他表中的字段,因为包含发送日期的表不包含我要查找的任何信息。 (希望有意义)这是我目前正在使用的代码,但它不起作用:

这是我开始使用代码之前得到的结果:

这是我要检索的内容:

select a.order_num, 
LAB_USER.NAME as ASGN_TECH, 
(select max(asn_assignment.dispatched) 
from asn_assignment 
where a.for_order=asn_assignment.for_order) as "max date"
from  asn_assignment, ord_order_state a, lab_user, lab_resource, asn_assignment
where
LAB_USER.USER_ID = LAB_RESOURCE.FOR_USER
AND LAB_RESOURCE.RESOURCE_ID = ASN_ASSIGNMENT.FOR_RESOURCE
and order_num in ('800000194709',
'800000213722',
'800006513931',
'800006525705')

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。样本数据和期望的结果也有帮助。为什么不使用正确、明确、标准、可读的JOIN 语法?
  • 你犯了这么多问题。您在 from 语句中有 2 个 asn_assignment 表,并且没有条件让 ord_order_state 与其他表相关。
  • 添加您的表格列以及示例数据,这样我们至少可以解决您的问题并尽可能解决它。

标签: sql oracle greatest-n-per-group analytic-functions


【解决方案1】:

也许先这样修复它,但仍然没有抓住你的意思:

select a.order_num, 
LAB_USER.NAME as ASGN_TECH, 
(select max(asn_assignment.dispatched) 
from asn_assignment 
where a.for_order=asn_assignment.for_order) as "max date"
from  asn_assignment, ord_order_state a, lab_user, lab_resource
where a.for_order=asn_assignment.for_order
and LAB_USER.USER_ID = LAB_RESOURCE.FOR_USER
AND LAB_RESOURCE.RESOURCE_ID = ASN_ASSIGNMENT.FOR_RESOURCE
and order_num in ('800000194709',
'800000213722',
'800006513931',
'800006525705')

【讨论】:

    【解决方案2】:

    你可以通过DENSE_RANK()解析函数等重写查询

    SELECT order_num, asgn_tech, dispatched
      FROM
      (
        SELECT o.order_num,
               lu.name as asgn_tech,
               a.dispatched,
               DENSE_RANK() OVER (PARTITION BY o.order_num 
                                      ORDER BY a.dispatched DESC) AS dr
          FROM asn_assignment a
          JOIN ord_order_state o
            ON o.for_order = a.for_order
          JOIN lab_resource lr
            ON lr.resource_id = a.for_resource
          JOIN lab_user lu
            ON lu.user_id = lr.for_user       
         WHERE order_num IN (800000194709, 800000213722, 800006513931, 800006525705)
       )
      WHERE dr = 1
    

    在哪里

    • 更喜欢使用包含JOIN关键字的SQL-92标准而不是 比以前的标准用逗号分隔表格
    • 适当的别名表有一个或两个(可能三个取决于 表的名称) 符合其名称首字母的字母或名称中的下划线分隔子字符串
    • IN 之后去掉包含列表中值的引号 考虑到order_num 数据类型的运算符是数字

    如果您的数据库是12c+,那么您也可以更喜欢使用下面的查询而不需要子查询,例如

    SELECT o.order_num,
           lu.name as asgn_tech,
           a.dispatched
      FROM asn_assignment a
      JOIN ord_order_state o
        ON o.for_order = a.for_order
      JOIN lab_resource lr
        ON lr.resource_id = a.for_resource
      JOIN lab_user lu
        ON lu.user_id = lr.for_user       
     WHERE order_num IN (800000194709, 800000213722, 800006513931, 800006525705)
     ORDER BY DENSE_RANK() OVER (PARTITION BY o.order_num ORDER BY a.dispatched DESC)     
     FETCH NEXT 1 ROW WITH TIES
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2018-11-18
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多