【问题标题】:When i select , only one column is checked without duplicates当我选择时,只检查一列而没有重复
【发布时间】:2019-10-17 21:32:37
【问题描述】:

我有一个这样的 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 |
+---------+---------+----------+--------------------+----------------------+

【问题讨论】:

  • 如果您只想从一个表中选择列(如您想要的结果),为什么要在查询中加入 2 个表?
  • 我错了。我想要的结果可以是一个表。但是,第一个表的数据比第二个表少得多,所以我认为获取数据所需的时间更少。
  • 当然。然后继续并在答案中尝试我的第二个查询。

标签: oracle duplicates


【解决方案1】:

与您的查询相比,您的表格描述让我感到困惑。但是,我能理解的是,您可能正在寻找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 

【讨论】:

  • 我认为你不需要第一张桌子来获得欲望结果
  • @JuanCarlosOropeza :是的,这是可能的。我查看了 OP 的查询,他们从两个表中选择列,因此保持这种方式,但所需的结果只有一个表中的列。正如我所说,这令人困惑。让 OP 澄清一下,我将编辑我的答案。
猜你喜欢
  • 2016-11-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 2020-06-18
  • 2021-11-20
  • 1970-01-01
  • 2013-01-08
相关资源
最近更新 更多