Нужно получить отрицание для набора полей в Oracle - PullRequest
0 голосов
/ 01 июня 2018

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

orig_code send_id ref_no
ABCD001   ABCD001 35RE777
ABCDXXX   ABCDXXX 35RE156
ABCD001   ABCD001 20PS789
ABCDXXX   ABCDXXX 20PS453
ABCD001   ABCD001 30RE745
ABCDXXX   ABCDXXX 55RE741
DBWS001   ABCD001 25PS369
MNKSXXX   ABCDXXX 21PS258
ABCD001   ABCD001 25PS369
ABCDXXX   ABCDXXX 21PS258

SELECT *
FROM T1
WHERE
((orig_code, send_id) NOT IN
                         ( ('ABCD001', 'ABCD001'),
                          ('ABCDXXX', 'ABCDXXX'))
AND (ref_no NOT LIKE '35RE%' OR ref_no NOT LIKE '20PS%'))

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

Результат, который я ищу, следующий.Может быть несколько форматов ссылок, и я включил только несколько.Мне нужно только удалить те, которые начинаются с 35RE или 20PS, при этом удовлетворяя значения полей orig_code и send_id.

ABCD001   ABCD001 30RE745
ABCDXXX   ABCDXXX 55RE741
DBWS001   ABCD001 25PS369
MNKSXXX   ABCDXXX 21PS258
ABCD001   ABCD001 25PS369
ABCDXXX   ABCDXXX 21PS258

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Согласно вашему последнему примеру, этого достаточно:

SELECT *
FROM T1
WHERE ref_no NOT LIKE '35RE%'
  and ref_no NOT LIKE '20PS%'

С вашими данными:

with T1(orig_code, send_id, ref_no) as (
    select 'ABCD001', 'ABCD001', '35RE777' from dual union all
    select 'ABCDXXX', 'ABCDXXX', '35RE156' from dual union all
    select 'ABCD001', 'ABCD001', '20PS789' from dual union all
    select 'ABCDXXX', 'ABCDXXX', '20PS453' from dual union all
    select 'ABCD001', 'ABCD001', '30RE745' from dual union all
    select 'ABCDXXX', 'ABCDXXX', '55RE741' from dual union all
    select 'DBWS001', 'ABCD001', '25PS369' from dual union all
    select 'MNKSXXX', 'ABCDXXX', '21PS258' from dual union all
    select 'ABCD001', 'ABCD001', '25PS369' from dual union all
    select 'ABCDXXX', 'ABCDXXX', '21PS258' from dual
)
SELECT *
FROM T1
WHERE ref_no NOT LIKE '35RE%'
  and ref_no NOT LIKE '20PS%'

ORIG_CODE SEND_ID REF_NO 
--------- ------- -------
ABCD001   ABCD001 30RE745
ABCDXXX   ABCDXXX 55RE741
DBWS001   ABCD001 25PS369
MNKSXXX   ABCDXXX 21PS258
ABCD001   ABCD001 25PS369
ABCDXXX   ABCDXXX 21PS258
0 голосов
/ 01 июня 2018

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE t1 ( orig_code, send_id, ref_no ) AS
SELECT 'ABCD001', 'ABCD001', '35RE777' FROM DUAL UNION ALL
SELECT 'ABCDXXX', 'ABCDXXX', '35RE156' FROM DUAL UNION ALL
SELECT 'ABCD001', 'ABCD001', '20PS789' FROM DUAL UNION ALL
SELECT 'ABCDXXX', 'ABCDXXX', '25PS453' FROM DUAL UNION ALL
SELECT 'ABCD001', 'ABCD001', '30RE745' FROM DUAL UNION ALL
SELECT 'ABCDXXX', 'ABCDXXX', '55RE741' FROM DUAL UNION ALL
SELECT 'ABCD001', 'ABCD001', '25PS369' FROM DUAL UNION ALL
SELECT 'ABCDXXX', 'ABCDXXX', '21PS258' FROM DUAL;

Запрос 1 :

SELECT *
FROM   t1
WHERE  (
         (orig_code, send_id) NOT IN (
           ('ABCD001', 'ABCD001'),
           ('ABCDXXX', 'ABCDXXX')
         )
         OR (                             -- OR rather than AND
             ref_no NOT LIKE '35RE%'
         AND ref_no NOT LIKE '20PS%'      -- AND rather than OR
         )
       )

Запрос 2 или, альтернативно, NOT(A) AND NOT(B) = NOT( A OR B ) и NOT(A) OR NOT(B) = NOT( A AND B ):

SELECT *
FROM   t1
WHERE  NOT (
         (orig_code, send_id) IN (
           ('ABCD001', 'ABCD001'),
           ('ABCDXXX', 'ABCDXXX')
         )
         AND (
             ref_no LIKE '35RE%'
         OR ref_no LIKE '20PS%'
         )
       )

Результаты :

| ORIG_CODE | SEND_ID |  REF_NO |
|-----------|---------|---------|
|   ABCDXXX | ABCDXXX | 25PS453 |
|   ABCD001 | ABCD001 | 30RE745 |
|   ABCDXXX | ABCDXXX | 55RE741 |
|   ABCD001 | ABCD001 | 25PS369 |
|   ABCDXXX | ABCDXXX | 21PS258 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...