Oracle-选择所需行仅包含一种特定类型数据的行

时间:2019-03-14 07:08:32

标签: sql oracle

我有两个桌子 表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'值的信用证,我不想获得此信用证。

我已经尝试了以下查询,但是我认为有专家可以用更好的方式或大多数调整的方式来完成它。

    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 个答案:

答案 0 :(得分:1)

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

demo

答案 1 :(得分:1)

您可以使用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'
  )

如果要获取table2的所有列,则:

select t2.* from table2 t2
..........................

答案 2 :(得分:0)

如果我理解正确,我认为group byhaving是最简单的查询:

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

这还具有每个lc刚返回一次的优点。