Нужно получать данные по их статусу, но данные избыточны - PullRequest
0 голосов
/ 23 апреля 2019

Итак, у меня есть таблица, в которой записываются все транзакции, будь то успех или неудача. Если по какой-либо причине транзакция не удалась, другое подразделение может повторить транзакцию, чтобы она была записана в той же таблице. Ниже приведен пример данных в моей таблице

id  | transaction_code | order_code | create_time | status  |
1   |      TR001       |   OC001    |  2019-04-16 |  Fail   |
2   |      TR001       |   OC001    |  2019-04-18 | Success |

Когда ордер получен повторно, он записывается с новым 'create_time'. Эта транзакция относится к категории успешных.

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

WHERE status = 'Fail' 

Другая проблема в том, что я не являюсь создателем этой схемы БД, и мой доступ ограничен (я могу использовать только операцию SELECT)

Есть ли способ решить мою проблему только с помощью запроса?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Есть несколько способов сделать это, я предлагаю вам попробовать их все и посмотреть, какой из них оптимален для вас

drop table if exists t;
create table t(
id  int, transaction_code varchar(10), order_code varchar(10), create_time date, status varchar(10));
insert into t values 
(1        ,  'TR001'          , 'OC001'     ,  '2019-04-16' ,   'Fail'),
(2        ,  'TR001'          , 'OC001'     ,  '2019-04-18' ,   'Success'),
(3        ,  'TR002'          , 'OC001'     ,  '2019-04-16' ,   'Fail'),
(4        ,  'TR003'          , 'OC001'     ,  '2019-04-16' ,   'success');

select t.*
from t
left join t t1 on t1.transaction_code = t.transaction_code and t1.status = 'Success'
where t1.status is null;


select * 
from t 
where status = 'FAIL' and 
        not exists (select 1 from t t1 where t1.transaction_code = t.transaction_code and status = 'Success');

select * 
from t
where t.transaction_Code not in(
select transaction_code from t t1 
where t1.transaction_code = t.transaction_code and status = 'Success'
);

+------+------------------+------------+-------------+--------+
| id   | transaction_code | order_code | create_time | status |
+------+------------------+------------+-------------+--------+
|    3 | TR002            | OC001      | 2019-04-16  | Fail   |
+------+------------------+------------+-------------+--------+
1 row in set (0.00 sec)
0 голосов
/ 23 апреля 2019

Вы можете использовать NOT EXISTS, чтобы найти все неудачные транзакции, которые не имеют статуса успеха:

SELECT *
FROM t
WHERE status = 'fail'
AND NOT EXISTS (
    SELECT 1
    FROM t AS x
    WHERE x.transaction_code = t.trasaction_code
    AND x.order_code = t.order_code -- not sure if it is required
    AND x.status = 'success'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...