Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用特定条件和其他SQL表选择具有最新时间戳的行_Sql_Oracle - Fatal编程技术网

使用特定条件和其他SQL表选择具有最新时间戳的行

使用特定条件和其他SQL表选择具有最新时间戳的行,sql,oracle,Sql,Oracle,我希望有人能帮助我解决这个问题 我有三张桌子 每个表都有一个ID,我可以使用它将所有表连接在一起。这些ID是不一样的,但它们可以正常工作并相互连接 我需要得到的是某些产品编号的最新更新日期时间戳可以是多个产品的状态 下面是表格的外观,它们要复杂得多,但我简化了它们 mercury.cs_batch_event PRODUCT_ID (VARCHAR2(100 CHAR)) CBL_REQUEST_ID (VARCHAR2(12 CHAR)) mercury.cs_status_srch CBL

我希望有人能帮助我解决这个问题

我有三张桌子

每个表都有一个ID,我可以使用它将所有表连接在一起。这些ID是不一样的,但它们可以正常工作并相互连接

我需要得到的是某些产品编号的最新更新日期时间戳可以是多个产品的状态

下面是表格的外观,它们要复杂得多,但我简化了它们

mercury.cs_batch_event
PRODUCT_ID (VARCHAR2(100 CHAR))
CBL_REQUEST_ID (VARCHAR2(12 CHAR))

mercury.cs_status_srch
CBL_REQUEST_ID (VARCHAR2(12 CHAR))
LOG_ID  (VARCHAR2(12 CHAR))
STATUS_REF_ID (NUMBER(8,0))

mercury.edit_log
ELOG_ID (VARCHAR2(12 CHAR))
ON_DATE_TIME (TIMESTAMP(6))
我尝试了几种不同的方法,在互联网上搜索了一段时间后,我最接近的方法是:

SELECT * 
FROM (SELECT cbl.product_id, src.status_ref_id,
             TO_CHAR(elog.on_date_time, 'dd/mm/yyyy hh24:mi:ss') date_updated
      FROM mercury.cs_batch_event cbl,
           mercury.cs_status_srch src, 
           mercury.edit_log elog
      WHERE cbl.product_id IN ('A555', 'B555')
        AND cbl.cbl_request_id = src.cbl_request_id
        AND src.log_id = elog.elog_id
      ORDER BY elog.on_date_time DESC)
WHERE rownum = 1
它在下面返回,这是正确的,但是当插入几个产品编号时,它仍然只返回一个产品的值,这可能是因为行号=1

谢谢

试试这个:

SELECT t1.product_number, t2.status,
    (SELECT Update_Time FROM Edit_log el
     INNER JOIN Status_srch ss ON el.ID_2 = ss.ID_2
     INNER JOIN Batch_event be ON ss.ID_1 = be.ID_1
     WHERE be.Product Number = t1.product_number
           AND RowNum<=1
     ORDER BY Update_Time DESC) AS date_updated
FROM Batch_event t1 
INNER JOIN Status_srch t2 ON t1.ID_1 = t2.ID_1
WHERE t1.product_number in ('A555', 'B555')
这应该做到:

SELECT 
  t1.product_number, 
  t2.status, 
  TO_CHAR (t3.update_time, 'dd/mm/yyyy hh24:mi:ss') date_updated,
FROM 
  batch_event t1, 
  status_srch t2, 
  edit_log t3
WHERE 
  t1.product_number in ('A555', 'B555')
  AND t1.ID_1 = t2.ID_1
  AND t2.ID_2 = t3.ID_2
  AND t3.update_time = (SELECT max(update_time) 
                        FROM edit_log 
                        WHERE ID_2 = t3.ID_2)
啊,我想我误解了你的数据。。请尝试以下方法:

SELECT 
  t1.product_number,
  t2.status,
  t3.update_time
FROM 
  batch_event t1, 
  status_srch t2, 
  edit_log t3,
(
    SELECT 
      batch_event.product_number product_number, 
      max(edit_log.update_time) maxupdatetime,
    FROM 
      batch_event, 
      status_srch, 
      edit_log
    WHERE 
      batch_event.ID_1 = status_srch.ID_1
      AND status_srch.ID_2 = edit_log.ID_2
    GROUP BY
      batch_event.product_number
) t4
WHERE t1.ID_1 = t2.ID_1
AND t2.ID_2 = t3.ID_2
AND t1.product_number = t4.product_number
AND t3.update_time = t4.maxupdatetime
可能是一个很好的例子


干杯,因为现在就要开始了!它似乎对我不起作用,因为它为我提供了该产品的所有更新时间。我已将原始表和sql更新为数据库中的实际值,因为我与它们混淆了,我花了一段时间才将其全部重命名!嘿,它看起来好像在工作,当我搜索多个产品代码时,它会返回更多的产品代码。明天我会更多地测试它,看看!谢谢你!!!嘿,Stevie,上面的工作就像我想要的那样!非常感谢你的帮助!非常感谢!!!!!!谢谢你,我想我用SELECT TOP 1尝试了类似的方法,但它给了我一个错误!它看起来不起作用,因为我得到了丢失的表达式错误。@Greg:试试我的新代码。。。我写的是产品代码而不是产品代码。试着让我知道谢谢Marco,问题不在于产品代码,这很尴尬,但我不认为我在使用SQL server!这可能是它不起作用的原因@格雷格:你在用MySql吗?博士后?神谕试着猜猜,让我知道。你现在得到了哪个错误?好的,我们能得到一些关于这个的样本起始数据吗?答案集可能很大,因为你可能有很多没有告诉我们的关系Pilcrow,谢谢你的帮助,但我已经从Stevie的查询中找到了答案@格雷格,我很高兴。在正确的方式上拥有更多也没有坏处当然,我还是会考虑的,我只是有点压力,现在得到时间,我需要什么!谢谢
SELECT 
  t1.product_number,
  t2.status,
  t3.update_time
FROM 
  batch_event t1, 
  status_srch t2, 
  edit_log t3,
(
    SELECT 
      batch_event.product_number product_number, 
      max(edit_log.update_time) maxupdatetime,
    FROM 
      batch_event, 
      status_srch, 
      edit_log
    WHERE 
      batch_event.ID_1 = status_srch.ID_1
      AND status_srch.ID_2 = edit_log.ID_2
    GROUP BY
      batch_event.product_number
) t4
WHERE t1.ID_1 = t2.ID_1
AND t2.ID_2 = t3.ID_2
AND t1.product_number = t4.product_number
AND t3.update_time = t4.maxupdatetime
SELECT product_id,
       status_ref_id,
       TO_CHAR(on_date_time, 'dd/mm/yyyy hh24:mi:ss')
FROM (SELECT cbl.product_id,
             src.status_ref_id,
             elog.on_date_time,
             ROW_NUMBER() OVER (PARTITION BY cbl.product_id ORDER BY on_date_time DESC)
               AS ordered_by_recency
      FROM mercury.cs_batch_event cbl,
           mercury.cs_status_srch src, 
       mercury.edit_log elog
      WHERE cbl.product_id IN ('A555', 'B555')
        AND cbl.cbl_request_id = src.cbl_request_id
        AND src.log_id = elog.elog_id) d
WHERE ordered_by_recency = 1