Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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,我试图根据另一个表中的主键从两个表中的一个表中选择一条记录。因此,一个“主”表和另外两个表,另外两个表都有一个FK JOB_ID和一个带有日期的列。我想根据给定作业id的这两个表中的一个表的最新日期获取记录。例如(我知道,表、列名和值没有多大意义,这些都是假的数据,但你会明白的)。在这两个额外的表中,我需要在结果中包含更多的列,这是为了简单起见。在甲骨文中也是如此 工作表 JOB_ID JOB_NAME JOB_ASSIGN 1 A job Tom

我试图根据另一个表中的主键从两个表中的一个表中选择一条记录。因此,一个“主”表和另外两个表,另外两个表都有一个FK JOB_ID和一个带有日期的列。我想根据给定作业id的这两个表中的一个表的最新日期获取记录。例如(我知道,表、列名和值没有多大意义,这些都是假的数据,但你会明白的)。在这两个额外的表中,我需要在结果中包含更多的列,这是为了简单起见。在甲骨文中也是如此

工作表

JOB_ID    JOB_NAME      JOB_ASSIGN
1         A job         Tom
2         Another job   Shawn
3         And another   Jason
作业子表1

JOB_ID    SUB_JOB_ID     COMPLETION_DATE
1         1              03/09/2015
1         2              03/08/2015
2         1              <null>
3         1              02/28/2015
3         2              03/01/2015
有了这些数据,我希望结果是:

JOB_ID    JOB_NAME      JOB_ASSIGN     SUB_JOB_ID     DATE
1         A job         Tom            1              03/09/2015
2         Another job   Shawn          2              03/07/2015
3         And another   Jason          3              03/10/2015
我能得到的最接近的东西是这样的:

SELECT JOB_ID,
       JOB_NAME,
       JOB_ASSIGN,
       SUB_JOB_ID,
       DATE
FROM   (SELECT JOB_ID,
               JOB_NAME,
               JOB_ASSIGN,
               SUB_JOB_ID,
               COMPLETION_DATE AS "DATE"
        FROM   JOB_SUB_1_TABLE
        WHERE  completion_date IN(SELECT Max(competion_date)
                                  FROM   JOB_SUB_1_TABLE
                                  GROUP  BY job_id,
                                            sub_job_id)
        UNION
        SELECT JOB_ID,
               JOB_NAME,
               JOB_ASSIGN,
               SUB_JOB_ID,
               START_DATE AS "DATE"
        FROM   JOB_SUB_2_TABLE
        WHERE  completion_date IN(SELECT Max(competion_date)
                                  FROM   JOB_SUB_2_TABLE
                                  GROUP  BY job_id,
                                            sub_job_id)) 

你可以按日期排序。由于您有两个相似的明细表,因此可以合并这些明细表,在主表上联接它们,然后根据两个子表的日期进行排序。结果应该与此类似:

SELECT  X.JOB_ID, 
        X.JOB_NAME, 
        X.JOB_ASSIGN,
        X.SUB_JOB_ID,
        X.JOB_DATE,
FROM  ( SELECT  T.JOB_ID, 
                T.JOB_NAME, 
                T.JOB_ASSIGN,
                ST.SUB_JOB_ID,
                ST.JOB_DATE,
                DENSE_RANK() 
                  OVER ( PARTITION BY T.JOB_ID 
                         ORDER BY ST.JOB_DATE DESC) AS DATERANK

        FROM    JOB_TABLE T
        JOIN (  SELECT  JOB_ID, 
                        SUB_JOB_ID, 
                        COMPLETION_DATE AS JOB_DATE
                FROM    JOB_SUB_1_TABLE ST1
                UNION ALL
                SELECT  JOB_ID, 
                        SUB_JOB_ID, 
                        START_DATE 
                FROM    JOB_SUB_2_TABLE ST2
              ) ST ON ST.JOB_ID = T.JOB_ID
      ) X
WHERE
  X.DATERANK = 1

你可以按日期排序。由于您有两个相似的明细表,因此可以合并这些明细表,在主表上联接它们,然后根据两个子表的日期进行排序。结果应该与此类似:

SELECT  X.JOB_ID, 
        X.JOB_NAME, 
        X.JOB_ASSIGN,
        X.SUB_JOB_ID,
        X.JOB_DATE,
FROM  ( SELECT  T.JOB_ID, 
                T.JOB_NAME, 
                T.JOB_ASSIGN,
                ST.SUB_JOB_ID,
                ST.JOB_DATE,
                DENSE_RANK() 
                  OVER ( PARTITION BY T.JOB_ID 
                         ORDER BY ST.JOB_DATE DESC) AS DATERANK

        FROM    JOB_TABLE T
        JOIN (  SELECT  JOB_ID, 
                        SUB_JOB_ID, 
                        COMPLETION_DATE AS JOB_DATE
                FROM    JOB_SUB_1_TABLE ST1
                UNION ALL
                SELECT  JOB_ID, 
                        SUB_JOB_ID, 
                        START_DATE 
                FROM    JOB_SUB_2_TABLE ST2
              ) ST ON ST.JOB_ID = T.JOB_ID
      ) X
WHERE
  X.DATERANK = 1

你可以按日期排序。由于您有两个相似的明细表,因此可以合并这些明细表,在主表上联接它们,然后根据两个子表的日期进行排序。结果应该与此类似:

SELECT  X.JOB_ID, 
        X.JOB_NAME, 
        X.JOB_ASSIGN,
        X.SUB_JOB_ID,
        X.JOB_DATE,
FROM  ( SELECT  T.JOB_ID, 
                T.JOB_NAME, 
                T.JOB_ASSIGN,
                ST.SUB_JOB_ID,
                ST.JOB_DATE,
                DENSE_RANK() 
                  OVER ( PARTITION BY T.JOB_ID 
                         ORDER BY ST.JOB_DATE DESC) AS DATERANK

        FROM    JOB_TABLE T
        JOIN (  SELECT  JOB_ID, 
                        SUB_JOB_ID, 
                        COMPLETION_DATE AS JOB_DATE
                FROM    JOB_SUB_1_TABLE ST1
                UNION ALL
                SELECT  JOB_ID, 
                        SUB_JOB_ID, 
                        START_DATE 
                FROM    JOB_SUB_2_TABLE ST2
              ) ST ON ST.JOB_ID = T.JOB_ID
      ) X
WHERE
  X.DATERANK = 1

你可以按日期排序。由于您有两个相似的明细表,因此可以合并这些明细表,在主表上联接它们,然后根据两个子表的日期进行排序。结果应该与此类似:

SELECT  X.JOB_ID, 
        X.JOB_NAME, 
        X.JOB_ASSIGN,
        X.SUB_JOB_ID,
        X.JOB_DATE,
FROM  ( SELECT  T.JOB_ID, 
                T.JOB_NAME, 
                T.JOB_ASSIGN,
                ST.SUB_JOB_ID,
                ST.JOB_DATE,
                DENSE_RANK() 
                  OVER ( PARTITION BY T.JOB_ID 
                         ORDER BY ST.JOB_DATE DESC) AS DATERANK

        FROM    JOB_TABLE T
        JOIN (  SELECT  JOB_ID, 
                        SUB_JOB_ID, 
                        COMPLETION_DATE AS JOB_DATE
                FROM    JOB_SUB_1_TABLE ST1
                UNION ALL
                SELECT  JOB_ID, 
                        SUB_JOB_ID, 
                        START_DATE 
                FROM    JOB_SUB_2_TABLE ST2
              ) ST ON ST.JOB_ID = T.JOB_ID
      ) X
WHERE
  X.DATERANK = 1

你也可以这样处理这个问题。
nulls last
是导致3/7/15出现的原因,而不是Faber建议的作业2的null

select x.job_id,
       y.job_name,
       y.job_assign,
       x.sub_job_id,
       x.completion_date as dt
  from (select x.*,
               row_number() over(  partition by job_id
                                       order by completion_date desc
                                                nulls last
                                ) as rn
          from (select *
                  from job_sub_1_table
                union all
                select *
                  from job_sub_2_table) x) x
  join job_table y
    on x.job_id = y.job_id
 where x.rn = 1

小提琴测试:

您也可以这样处理问题。
nulls last
是导致3/7/15出现的原因,而不是Faber建议的作业2的null

select x.job_id,
       y.job_name,
       y.job_assign,
       x.sub_job_id,
       x.completion_date as dt
  from (select x.*,
               row_number() over(  partition by job_id
                                       order by completion_date desc
                                                nulls last
                                ) as rn
          from (select *
                  from job_sub_1_table
                union all
                select *
                  from job_sub_2_table) x) x
  join job_table y
    on x.job_id = y.job_id
 where x.rn = 1

小提琴测试:

您也可以这样处理问题。
nulls last
是导致3/7/15出现的原因,而不是Faber建议的作业2的null

select x.job_id,
       y.job_name,
       y.job_assign,
       x.sub_job_id,
       x.completion_date as dt
  from (select x.*,
               row_number() over(  partition by job_id
                                       order by completion_date desc
                                                nulls last
                                ) as rn
          from (select *
                  from job_sub_1_table
                union all
                select *
                  from job_sub_2_table) x) x
  join job_table y
    on x.job_id = y.job_id
 where x.rn = 1

小提琴测试:

您也可以这样处理问题。
nulls last
是导致3/7/15出现的原因,而不是Faber建议的作业2的null

select x.job_id,
       y.job_name,
       y.job_assign,
       x.sub_job_id,
       x.completion_date as dt
  from (select x.*,
               row_number() over(  partition by job_id
                                       order by completion_date desc
                                                nulls last
                                ) as rn
          from (select *
                  from job_sub_1_table
                union all
                select *
                  from job_sub_2_table) x) x
  join job_table y
    on x.job_id = y.job_id
 where x.rn = 1

小提琴测试:

那么,该查询返回什么,它与您想要的有什么不同?那么,该查询返回什么,它与您想要的有什么不同?那么,该查询返回什么,它与您想要的有什么不同?那么,该查询返回什么,它与您想要的有何不同?如果您已经按照
作业id
进行分区,是否需要按
作业id
进行排序?我认为这不会有任何影响。此外,要对
NULL
日期最后一次排序,您只需执行以下操作:
按完成顺序排序\u date DESC NULLS last
(默认情况下,排序顺序为
DESC
时,值排在第一位)是的,您是对的(re:tware),更改为使用
nulls last
syntaxIs如果您已经按
job\u id
分区,则需要按
job\u id
排序?我认为这不会有任何影响。此外,要对
NULL
日期最后一次排序,您只需执行以下操作:
按完成顺序排序\u date DESC NULLS last
(默认情况下,排序顺序为
DESC
时,值排在第一位)是的,您是对的(re:tware),更改为使用
nulls last
syntaxIs如果您已经按
job\u id
分区,则需要按
job\u id
排序?我认为这不会有任何影响。此外,要对
NULL
日期最后一次排序,您只需执行以下操作:
按完成顺序排序\u date DESC NULLS last
(默认情况下,排序顺序为
DESC
时,值排在第一位)是的,您是对的(re:tware),更改为使用
nulls last
syntaxIs如果您已经按
job\u id
分区,则需要按
job\u id
排序?我认为这不会有任何影响。此外,要对
NULL
日期最后一次排序,您只需执行以下操作:
按完成顺序排序\u date DESC NULLS last
(默认情况下,排序顺序为
DESC
时,值排在第一位)是的,您是对的(re:two),更改为使用
NULLS last
语法