当我选择时,仅检查一列而不重复

时间:2019-06-01 16:35:08

标签: oracle duplicates

我有2张这样的桌子:

first table
+------------+---------------+--------+  
| pk         | user_one      |user_two|   
+------------+---------------+--------+  
second table
+------------+---------------+--------+----------------+----------------+   
| pk         | sender        |receiver|fk of firsttable|content        |
+------------+---------------+--------+----------------+----------------+  

第一张表和第二张表具有一对多(1:N)关系。

第二个表中有很多记录:

| pk    | sender|receiver|fk of firsttable|content           |
|120    |car224 |car223  |1               |test message1 to 223
|121    |car224 |car223  |1               |test message2 to 223
|122    |car224 |car225  |21              |test message1 to 225
|123    |car224 |car225  |21              |test message2 to 225
|124    |car224 |car225  |21              |test message3 to 225
|125    |car224 |car225  |21              |test message4 to 225

我需要确定fk是否具有相同的值,并且我想要具有最大pk的行。

我更改了上面的列名,以使其更易于理解。

这是到目前为止我尝试过的实际sql

select *
  from (select rownum rn,
               mr.mrno,
               mr.user_one,
               mr.user_two,
               m.mno,
               m.content
          from tbl_messagerelation mr,
               tbl_message m 
          where (mr.user_one = 'car224' or
                 mr.user_two='car224') and
                m.rowid in (select max(rowid)
                              from tbl_message
                              group by m.mno) and
                rownum <= 1*20)
  where rn > (1-1) * 20 

这是结果:

+---------+-------+----------+----------+-------------------------+----------------------+
|  rn     |  mrno | user_one | user_two | mno(pk of second table) |        content       |
+---------+-------+----------+----------+-------------------------+----------------------+
|       1 |     1 | car224   | car223   |                     125 | test message4 to 225 |
|       2 |    21 | car224   | car225   |                     125 | test message4 to 225 |
+---------+-------+----------+----------+-------------------------+----------------------+

我想要的结果是这样的:

+---------+---------+----------+--------------------+----------------------+
|  fk     |  sender | receiver | pk of second table | content              |
+---------+---------+----------+--------------------+----------------------+
|       1 | car224  | car223   |                121 | test message2 to 223 |
|      21 | car224  | car223   |                125 | test message4 to 225 |
+---------+---------+----------+--------------------+----------------------+

1 个答案:

答案 0 :(得分:0)

与查询相比,您的表描述使我感到困惑。但是,据我了解,您可能正在寻找row_number()

一个重要的建议是对连接使用标准的显式JOIN语法,而不是过时的a,b语法。联接键对我来说还不清楚,您可以在最终查询中适当地替换它。

select * from
(
select mr.*, m.*, row_number() over ( partition by m.fk order by m.pk desc ) as rn
from tbl_messagerelation mr join  tbl_message m on mr.? = m.? 
) where rn =1 

或者也许您根本不需要加入

select * from
(
select  m.*, row_number() over ( partition by m.fk order by m.pk desc ) as rn
 from  tbl_message m 
) where rn =1