Мой код не сравнивает каждую строку в Oracle - PullRequest
0 голосов
/ 03 марта 2020

Ниже приведен мой код, я хочу выбрать не существует во второй таблице


select t.reg,
       t.dist,
       t.pkey,
       t.n_code,
       t.sum as s17,
       s.sum as s18
  from table1 t,
       (select *
          from table2 t
         where t.pkey is not null) s
 where t.pkey= s.pkey
   and t.reg= s.reg
   and t.dist= s.dist
   and t.a = 99
   and s.a != 99
   and t.n_code= 66
   and t.n_code = s.n_code
   and t.sum > 0
   and t.sum not in s.sum  --not in is not working i think
   and t.reg= 33
   and t.dist= 1

t.sum не сравнивается в каждой строке во второй таблице, значение из первой таблицы существует во второй таблице, но в другой строке.

код, который также не ищет другие строки PL / SQL

Ответы [ 3 ]

0 голосов
/ 03 марта 2020

Хотелось бы что-нибудь подобное? Несколько более более симпатичный код с явными объединениями и условиями, перенесенными в предложение where.

select t.reg,
       t.dist,
       t.pkey,
       t.n_code,
       t.sum as s17,
       s.sum as s18
  from table1 t join table2 s
    on  t.pkey= s.pkey
    and t.reg= s.reg
    and t.dist= s.dist
    and t.n_code = s.n_code
    and t.sum <> s.sum        --> this
  where t.pkey is not null
    and t.a = 99
    and s.a != 99
    and t.n_code= 66
    and t.sum > 0
    and t.reg= 33
    and t.dist= 1
0 голосов
/ 03 марта 2020

Вы можете использовать not exists, но быстрее добавить условную count() проверку, совпадают ли суммы (во всем окне). Если это число <> 0, удалите строку из выходных данных.

select reg, dist, pkey, n_code, s17, s18 
  from (
    select t.reg, t.dist, t.pkey, t.n_code, t.sum as s17, s.sum as s18, 
           count(case when t.sum = s.sum then 1 end) 
             over (partition by t.pkey, t.reg, t.dist, t.n_code) cnt_same
      from table1 t
      join (select * from table2 t where t.pkey is not null) s
        on t.pkey = s.pkey and t.reg = s.reg and t.dist = s.dist and t.n_code = s.n_code
       where t.a = 99 and s.a != 99 and t.n_code= 66 
         and t.sum > 0 and t.reg= 33 and t.dist = 1)
  where cnt_same = 0

dbfiddle demo

Эта часть важна :

over (partition by t.pkey, t.reg, t.dist, t.n_code)

Определяет, в каком диапазоне мы проверяем суммы. Если вы хотите отсканировать всю таблицу, используйте:

over ()

, если вы хотите использовать только одну и ту же кнопку pkey

over (partition by t.pkey)
0 голосов
/ 03 марта 2020

Not in не работает так. Синтаксис Not in равен t.sum Not in (10,20), вы также можете использовать подзапрос вместо значений c.

Но здесь Not In не требуется. Вы можете заменить следующие

and t.sum not in s.sum

на

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