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