Когда я выбираю, проверяется только один столбец без дубликатов - PullRequest
1 голос
/ 01 июня 2019

У меня есть 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 голосов
/ 01 июня 2019

Описание вашей таблицы по сравнению с вашим запросом сбивает меня с толку.Однако я понял, что вы, вероятно, ищете 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 
...