как выбрать отдельные записи в oracle? - PullRequest
0 голосов
/ 03 февраля 2020

Я хочу выбрать отдельные строки при некоторых условиях, но когда я добавляю столбец id в операторе select, он возвращает все строки ???

приведенный ниже запрос работает нормально

select distinct dst_bnk_acnt_id
,dst_cust_id
,org_cust_id
,dst_pos_id
,pmt_typ_cd 
from tb_cm_t_pmt_coll
where org_pos_id = 8 OR dst_pos_id = 8 OR dst_bnk_acnt_id = 1 ;

но когда я хочу выбрать последнюю запись, используя порядок по идентификатору (des c), он возвращает все строки!

SELECT  distinct id
,dst_bnk_acnt_id
,dst_cust_id
,org_cust_id
,dst_pos_id
,pmt_typ_cd  
FROM  tb_cm_t_pmt_coll
WHERE org_pos_id = 8 OR dst_pos_id = 8 OR dst_bnk_acnt_id = 1 
ORDER BY id DESC;

я знаю, что столбец 'id' является первичным ключом, и все его значения уникальны и из-за этого все строки становятся уникальными.

Я хочу выбрать отдельную строку, используя только эти [dst_bnk_acnt_id,dst_cust_id,org_cust_id,dst_pos_id,pmt_typ_cd] столбцы, но я также хочу упорядочить их, используя id в порядке убывания.

пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Я бы использовал оконные функции для этого:

select id,
       dst_bnk_acnt_id,
       dst_cust_id, 
       org_cust_id,
       dst_pos_id,
       pmt_typ_cd
FROM (
  SELECT id,
         dst_bnk_acnt_id,
         dst_cust_id, 
         org_cust_id,
         dst_pos_id,
         pmt_typ_cd, 
         row_number() over (partition by dst_bnk_acnt_id,dst_cust_id,org_cust_id,dst_pos_id,pmt_typ_cd 
                            order by id desc) as rn  
  FROM  tb_cm_t_pmt_coll
  WHERE org_pos_id = 8 
     OR dst_pos_id = 8 
     OR dst_bnk_acnt_id = 1 
)  
WHERE rn = 1
ORDER BY id;

order by id desc в оконной функции дает строку с наибольшим id номером строки 1, выбирая самую последнюю id для каждого сочетание отдельных столбцов.

1 голос
/ 03 февраля 2020

У меня нет ваших таблиц, поэтому я буду использовать образец схемы Скотта.

Отдельные отделы и задания:

SQL> select distinct deptno, job from emp;

    DEPTNO JOB
---------- ---------
        20 CLERK
        30 SALESMAN
        20 MANAGER
        30 CLERK
        10 PRESIDENT
        30 MANAGER
        10 CLERK
        10 MANAGER
        20 ANALYST

9 rows selected.

Мы бы хотели отсортировать данные по EMPNO (что-то вроде вашего ID):

SQL> select distinct deptno, job from emp order by empno;
select distinct deptno, job from emp order by empno
                                              *
ERROR at line 1:
ORA-01791: not a SELECTed expression


SQL>

Это не сработает (как вы уже знаете). Но если вы используете подзапрос (или CTE), вы получите следующее:

SQL> with temp as
  2    (select min(empno) id, deptno, job
  3     from emp
  4     group by deptno, job
  5     order by 1 desc
  6    )
  7  select deptno, job
  8  From temp
  9  order by id desc;

    DEPTNO JOB
---------- ---------
        10 CLERK
        30 CLERK
        10 PRESIDENT
        20 ANALYST
        10 MANAGER
        30 MANAGER
        20 MANAGER
        30 SALESMAN
        20 CLERK

9 rows selected.

SQL>

, что означает, что ваш запрос может выглядеть следующим образом:

WITH temp
     AS (  SELECT MIN (id) id,
                  dst_bnk_acnt_id,
                  dst_cust_id,
                  org_cust_id,
                  dst_pos_id,
                  pmt_typ_cd
             FROM tb_cm_t_pmt_coll
            WHERE    org_pos_id = 8
                  OR dst_pos_id = 8
                  OR dst_bnk_acnt_id = 1
         GROUP BY dst_bnk_acnt_id,
                  dst_cust_id,
                  org_cust_id,
                  dst_pos_id,
                  pmt_typ_cd)
  SELECT dst_bnk_acnt_id,
         dst_cust_id,
         org_cust_id,
         dst_pos_id,
         pmt_typ_cd
    FROM temp
ORDER BY id DESC;
...