加入多个表时从表中选择最大日期

问题描述

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

这是我在开始使用代码之前得到的信息:

enter image description here

这就是我要检索的内容

enter image description here

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')

解决方法

也许先像这样修复它,但仍然没有抓住你的重点:

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')
,

您可以通过使用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,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,800006525705)
 ORDER BY DENSE_RANK() OVER (PARTITION BY o.order_num ORDER BY a.dispatched DESC)     
 FETCH NEXT 1 ROW WITH TIES