问题描述
我正在尝试编写一个查询来检索最大调度日期并从多个表中引入字段。我使用其他表中的字段,因为包含发送日期的表不包含我要查找的任何信息。 (希望有意义)这是我目前正在使用的代码,但它不起作用:
这是我在开始使用代码之前得到的信息:
这就是我要检索的内容:
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