加入 4 个表并根据 3 个时间戳选择不同的值

0 oracle optimization

我一直在尝试根据时间从我的查询结果中删除重复项,但我需要考虑 3 个不同的时间,我不知道该怎么做。由于某些测试多次发生,part_id 上存在重复项,我只想从所有 3 个表中获得最后一次测试的结果。

我现在正在运行这个查询

select lb.request_ky,
lb.build_dm,
lb.part_id,
dv.date_test,
dv.result,
dw.date_test,
dw.result,
tt.date_test,
tt.result

From tableA lb,
tableB dv,
tableC dw,
tableD tt

Where lb.part_id = dv.part_id
And lb.part_id = dw.part_id
And lb.part_id = tt.part_id
Run Code Online (Sandbox Code Playgroud)

这个查询会给我部分 id 的重复项。我怎样才能从每个表中获取最新结果并将它们连接在一起?

ype*_*eᵀᴹ 5

您必须首先定义如何识别“测试”以及“最新”是什么。哪些列标识测试,哪些日期列将用于排序?

然后,编写查询的一种方法是使用窗口函数:

With cte As
  ( Select 
        lb.request_ky,
        lb.build_dm,
        lb.part_id,
        dv.date_test As date_test1,
        dv.result    As result1,
        dw.date_test As date_test2,
        dw.result    As result2,
        tt.date_test As date_test3,
        tt.result    As result3,
        Row_number() Over (Partition By          -- pick a column for the
                             lb.part_id          -- identification
                           Order By              -- and another for the 
                             dv.date_test Desc)  -- order
            As rn
    From 
        tableA lb
      Join tableB dv
        On lb.part_id = dv.part_id
      Join tableC dw
        On lb.part_id = dw.part_id
      Join tableD tt
        On lb.part_id = tt.part_id
  )
Select 
    request_ky,
    build_dm,
    part_id,
    date_test1,
    result1,
    date_test2,
    result2,
    date_test3,
    result3
From
    cte
Where
    rn = 1 ;
Run Code Online (Sandbox Code Playgroud)