Oracle - выберите строку, в которой нужный столбец содержит только один конкретный тип данных - PullRequest
0 голосов
/ 14 марта 2019

у меня два стола Таблица 1

    +--------+--------+
    |   LC   | STATUS |
    +--------+--------+
    | 010051 |    6   |
    +--------+--------+
    | 010071 |    2   |
    +--------+--------+
    | 010048 |    2   |
    +--------+--------+
    | 010113 |    2   |
    +--------+--------+
    | 010125 |    2   |
    +--------+--------+

Таблица 2

    +--------+-------------+-----------+------------+--------+
    |   LC   |     BILL    | LAST_BILL | PAYMENT_BY | STATUS |
    +--------+-------------+-----------+------------+--------+
    | 010125 | BILL/17/001 |     0     |      C     |    6   |
    +--------+-------------+-----------+------------+--------+
    | 010125 | BILL/17/002 |     0     |      I     |    1   |
    +--------+-------------+-----------+------------+--------+
    | 010125 | BILL/17/003 |     0     |      F     |    1   |
    +--------+-------------+-----------+------------+--------+
    | 010125 | BILL/17/004 |     0     |      C     |    6   |
    +--------+-------------+-----------+------------+--------+
    | 010113 | BILL/17/005 |     0     |      C     |    6   |
    +--------+-------------+-----------+------------+--------+
    | 010113 | BILL/17/006 |     0     |      I     |    1   |
    +--------+-------------+-----------+------------+--------+
    | 010048 | BILL/17/007 |     0     |      C     |    6   |
    +--------+-------------+-----------+------------+--------+
    | 010071 | BILL/17/008 |     0     |      C     |    6   |
    +--------+-------------+-----------+------------+--------+

Где я просто хочу получить аккредитив, чей PAYMENT_BY равен 'C', но другим, у которых есть значение 'C' и значение, отличное от 'C', я не хочу получать этот LC.

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

    SELECT   LC
      FROM   (SELECT   T1.LC
                FROM   TABLE1 T1, TABLE2 T2
               WHERE       T1.STATUS = 2
                       AND T1.LC = T2.LC
                       AND T2.PAYMENT_BY = 'C'
                       AND LAST_BILL = 0
                       AND T2.STATUS = 6
              MINUS
              SELECT   T1.LC
                FROM   TABLE1 T1, TABLE2 T2
               WHERE       T1.STATUS = 2
                       AND T1.LC = T2.LC
                       AND T2.PAYMENT_BY = 'I'
                       AND LAST_BILL = 0)  

Запрос / ожидаемый результат:

    +--------+
    |   LC   |
    +--------+
    | 010048 |
    +--------+
    | 010071 |
    +--------+

Ответы [ 3 ]

1 голос
/ 14 марта 2019

Вы можете сделать это с помощью NOT EXISTS:

select t2.lc from table2 t2
where 
  t2.payment_by = 'C'
  and
  not exists (
    select lc from table2
    where lc = t2.lc and payment_by <> 'C'
  )

Если вам нужны все столбцы таблицы2, то:

select t2.* from table2 t2
..........................
1 голос
/ 14 марта 2019

Если я правильно понимаю, я думаю, group by и having - самый простой запрос:

select t2.lc
from table2 t2
group by t2.lc
having min(t2.payment_by) = 'C' and max(t2.payment_by) = 'C';

Это также имеет то преимущество, что каждый lc возвращается ровно один раз.

1 голос
/ 14 марта 2019
select t.lc, 
       count(case when t.payment_by = 'C' THEN 1 else NULL end ) as count_c,
       count(case when t.payment_by <> 'C' THEN 1 else NULL end ) as count_not_c
  from table2 t
 group by t.lc 
 having count(case when t.payment_by <> 'C' THEN 1 else NULL end ) < 1

демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...