Oracle数据库 - 如何组合这两个表,以便where子句查看多个值?

时间:2016-10-11 17:27:37

标签: sql oracle

真的不知道怎么说这个。我有两个表,t1和t2。 t1包含很长的消息历史,因此它有[message,t1_id,t2_d]。 t2,为了这个例子,只有t2_id。我想找到与最高t1_id相关的消息。这很容易

select message
from t1
where t1_id = (
    select MAX(t1_id) as mx
    from t1
    where t2_id = 1
);

但是正如你所看到的,我已经对t2_id进行了硬编码。我的意图是这个代码(目前只返回来自一个id的最高消息)这样做一个所有不同的id#s。有几种方法可以做到这一点,但我知道你可以做到

select t2_id
from t2;

那么我怎么能用上面的select语句基本上替换硬编码呢?我知道我不能直接,但即使使用GROUP BY,我也没有运气。

澄清:t1中的t2_id列与t2中的t2_id列相关。所以在t1中,将会有很多来自t2的t2_id重复。所以我只想在t1中具有最高t1_id的每个t2_id的消息。所以t1有几千行但只有大约20个不同的t2_id,所以我应该有20行结果。

2 个答案:

答案 0 :(得分:1)

使用相关子查询:

select message
from t1
where t1_id = (
    select MAX(t1_id) as mx
    from t1 ttt
    where t1.t2_id = ttt.t2_id
);

还有其他方式来表达此查询 - 使用row_number()keepjoin是典型的方法。但是保持形式,相关的子查询是一种可行的方法。

答案 1 :(得分:1)

更有效的解决方案(可能是最有效的解决方案),使用更高级的功能。

select t2_id,                     -- you probably need this! 
       max(t1_id) as max_t1_id,   -- if needed
       max(message) keep (dense_rank last order by t1_id) as message
from t1
group by t2_id;