Select PL/SQL-如何根据最新创建的日期从3个表中提取数据

Select PL/SQL-如何根据最新创建的日期从3个表中提取数据,select,plsql,max,join,Select,Plsql,Max,Join,我希望有人能帮助我,因为我已经被这个问题困扰了几天了。基本上,我试图从Oracle中的3个表中提取数据:1)订单表2)供应商表和3)主数据表 以下是3张表的外观: 表1:BIZ_DOC2(订单表) OBJECTID(唯一键) 唯一的文件名(文件名,即ORD-005) 创建日期(订单创建日期) 表2:UDEF_供应商(供应商表): 父对象ID(与订单表中的对象ID匹配) 供应商\对象\名称(这是供应商的名称,即Acme) 表3:BIZ_单位(主数据表) 父对象ID(与订单表中的对象ID匹配) 业务

我希望有人能帮助我,因为我已经被这个问题困扰了几天了。基本上,我试图从Oracle中的3个表中提取数据:1)订单表2)供应商表和3)主数据表

以下是3张表的外观:

表1:BIZ_DOC2(订单表) OBJECTID(唯一键)
唯一的文件名(文件名,即ORD-005)
创建日期(订单创建日期)

表2:UDEF_供应商(供应商表): 父对象ID(与订单表中的对象ID匹配)
供应商\对象\名称(这是供应商的名称,即Acme)

表3:BIZ_单位(主数据表) 父对象ID(与订单表中的对象ID匹配)
业务单元对象名称(这是业务单元的名称,即小部件A、小部件B)

注意:供应商表和主数据之间没有链接,除非通过订单表

我可以连接表中的所有数据,看起来像这样:

在选择最新订单日期之前: ORD-005 |小部件A | Acme | 3/14/10
ORD-005 |小部件B | Acme | 3/14/10
ORD-004 |小部件C | Acme | 3/10/10

理想情况下,我想返回每个供应商的最新订单。但是,每个订单可能包含多个业务单元(例如,小部件类型),因此,如果供应商的最新记录是ORD-005,并且订单包含2个业务单元,则以下列将显示结果集:唯一的文档名称、业务单元对象名称、供应商对象名称、创建时间

按最新订单日期选择后: ORD-005 |小部件A | Acme | 3/14/10
ORD-005 |小部件B | Acme | 3/14/10


我试着使用Select Max和几个不同的子查询,但似乎无法正常工作。任何帮助都将不胜感激

这里是另一个使用解析函数的解决方案。它不获取最大日期的第一个值,而是对日期进行排序,并获取最新日期的所有值

SELECT
  O.UNIQUE_DOC_NAME,
  U.BIZ_UNIT_OBJECT_NAME,
  V.VENDOR_OBJECT_NAME,
  O.CREATED_AT
 FROM
  ( SELECT
      V.VENDOR_OBJECT_NAME, MAX(O.CREATED_AT) AS CREATED_AT
     FROM
      UDEF_VENDOR AS V
     INNER JOIN
      BIZ_DOC2 AS O
     ON
      V.PARENT_OBJECT_ID=O.OBJECTID
     GROUP BY
      V.VENDOR_OBJECT_NAME
  ) AS VO   -- most recent order date per vendor
 INNER JOIN
  UDEF_VENDOR AS V
 ON
  V.VENDOR_OBJECT_NAME=VO.VENDOR_OBJECT_NAME
 INNER JOIN
  BIZ_DOC2 AS O
 ON         -- re-match vendors to orders for latest date
  O.OBJECTID=V.PARENT_OBJECT_ID AND
  O.CREATED_AT=VO.CREATED_AT
 INNER JOIN
  BIZ_UNIT AS U
 ON
  U.PARENT_OBJECT_ID=O.OBJECTID
select unique_doc_name, biz_unit_object_name, vendor_object_name, created_at
from (select unique_doc_name, biz_unit_object_name,
             vendor_object_name, created_at,
             rank () over (order by created_date desc) rnk
      from biz_doc2 d, udef_vendor v, biz_unit u
      where d.object_id = v.parent_object_id
      and d.objectid = u.parent_object_id)
where rnk = 1;

嗨,弗拉德,哇,太快了!非常感谢你的解决方案。我现在就试试看,如果行得通,我会告诉你的。谢谢!:)您好,弗拉德,这很奇怪,但我得到了一个Oracle ORA-00907:缺少右括号错误,即使您的代码中没有缺少括号。我已经仔细检查了所有的东西。。。你知道问题是什么吗?再次感谢你的帮助!嗯,这里的语法很好。。。你试过删除评论吗?忽略我的上一篇帖子,因为我通过删除每个别名前的“as”实现了你的查询,效果非常好!再次非常感谢您的帮助!:)嗨,杰夫,谢谢你的回答!我得到了第一个有效的答案,但我肯定也会尝试你的答案。我没有考虑按函数划分,所以我要试一试。谢谢!:)此查询的优点是只需要通过表一次。它的缺点是,如果一个供应商有多条最新创建的记录,那么它只报告一行。嗨,杰夫,我也尝试了你的查询,结果成功了!是的,我明白你的意思,如果在同一日期为同一供应商创建了两条记录,那么它只返回一条记录。我会考虑一下,但现在会投票表决你的答案,因为它是有效的。再次感谢!你好,艾伦,谢谢你的帮助!:)我要试试看能不能让它工作。非常感谢!
select unique_doc_name, biz_unit_object_name, vendor_object_name, created_at
from (select unique_doc_name, biz_unit_object_name,
             vendor_object_name, created_at,
             rank () over (order by created_date desc) rnk
      from biz_doc2 d, udef_vendor v, biz_unit u
      where d.object_id = v.parent_object_id
      and d.objectid = u.parent_object_id)
where rnk = 1;