Как выбрать только первый ряд? - PullRequest
1 голос
/ 24 мая 2019

У меня есть эта таблица

Table_A

  link    name
  1       toto 
  2       lulu

Table_B

  link    action   date
  1       OK       01/02/2010 
  1       OK       01/02/2022
  1       OK       01/03/2021
  1       OK       01/02/2025

Тогда я хочу сделать запрос как

Select 
  * 
from 
  Table_A, Table_B 
where
  table_A.link (+)= table_b.link and
  table_b.action (+)= 'OK' 

проблема в том, что этот запрос возвращает дубликаты

link    name    action    date
1       toto    OK        01/02/2010 
1       toto    OK        01/02/2022
1       toto    OK        01/03/2021
1       toto    OK        01/02/2025
2       lulu

ия хочу:

link    name    action    date
1       toto    OK        01/02/2025
2       lulu

Как это сделать?

Ответы [ 5 ]

1 голос
/ 24 мая 2019

Обычно лучше использовать синтаксис ANSI-соединений, но, следуя вашим указаниям, я буду использовать синтаксис Oracle (с оператором "плюс" для внешних объединений).

Во-первых, обратите внимание, что у вас есть "«плюс» не с той стороны в первом условии в предложении WHERE;вам нужно, чтобы «фиктивные» строки были добавлены к table_B, а не к table_A.

Затем, как правило, лучше сначала выполнить агрегацию, если она зависит только от одной таблицы.Это то, что я делаю в подзапросе в предложении FROM ниже.

Кроме того, date - это ключевое слово Oracle, и его не следует использовать в качестве имени столбца.Я надеюсь, что вы не используете это таким образом.Для моего кода я предположил, что имя столбца dt.

select a.link, a.name, b.action, b.dt
from   table_a a,
       ( select link, 'OK' action, max(dt) dt
         from   table_b
         where  action = 'OK'
         group  by link
       ) b
where  b.link (+) = a.link
;
0 голосов
/ 24 мая 2019

1) Используйте ключевое слово GROUP BY

https://www.techonthenet.com/oracle/group_by.php

2) Для даты рекомендуется использовать формат: ГГГГ-ММ-дд

link action date
1    OK     2010-02-01

Для отображения:

link name action date
1    toto OK     2025-02-01
2    lulu        2023-03-01

вставить запись lulu в Table_b

Моя таблица_b:

link  action  date
1     OK      2010-02-01
1     OK      2022-02-01
1     OK      2021-03-01
1     OK      2025-02-01
2             2023-03-01

3) Попробуйте этот запрос (синтаксис Mysql):

SELECT 
  Table_A.link, Table_a.name, action, MAX(date) AS date
FROM 
  Table_A, Table_B 
WHERE
  Table_A.link = Table_B.link
  GROUP BY name
  ORDER BY link;
0 голосов
/ 24 мая 2019

Используйте правильный, явный, стандартный JOIN синтаксис!

Простой способ написать запрос:

Select a.*, b.*
from Table_A a left join
     (select b.*, row_number() over (partition by b.link order by b.date desc) as seqnum
      from Table_B b
      where b.action = 'OK'
     ) b
     on b.link = a.link and b.seqnum = 1;

Или используйте агрегацию:

Select a.link, a.name, b.action, max(b.date)
from Table_A a left join
     Table_B b
     on b.link = a.link and b.action = 'OK'
group by a.link, a.name, b.action
0 голосов
/ 24 мая 2019

Вы можете использовать row_number() окно аналитической функции

Select link, name, action, "date"
  From
  (
   Select a.link, a.name, b.action, b."date",
          row_number() over (partition by a.link order by b."date" desc ) as rn
     From Table_A a
     Left Join Table_B b 
       on a.link = b.link
      and b.action = 'OK' 
  )
  Where rn = 1;

LINK  NAME  ACTION  date
----  ----- ------  ----------
1     toto  OK      01.02.2025
2     lulu  NULL    NULL

Демо

P.S. Очевидно, я не предлагаю старый синтаксис с разделением запятыми, тогда как я делаю синтаксис ANSI-92 SQL, как в приведенном выше запросе. Еще одно замечание, что SQL базы данных Oracle не требует псевдонима для подзапроса, но большинство других СУБД делает это.

0 голосов
/ 24 мая 2019

Вы можете использовать оператор Distinct: https://www.techonthenet.com/oracle/distinct.php для выбора уникальных данных.

Также проверьте оператор Group By: https://www.techonthenet.com/oracle/group_by.php для группировки по определенным столбцам, например, для выбора уникальных имен:

Select 
  * 
from 
  Table_A, Table_B 
where
  table_A.link (+)= table_b.link and
  table_b.action (+)= 'OK'
group by table_A.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...