Исключить part_no - PullRequest
       15

Исключить part_no

0 голосов
/ 01 мая 2019

Я хочу выбрать PART_NO из этой таблицы (INVENTORY_TRANSACTION_HIST_TAB), но нет, если деталь имеет TRANSACTION_CODE NREC или NISS. I.e PART_NO 101247 не должен быть возвращен, но 1001709 должен быть возвращен.

1012427

10001709

Если я введу

SELECT  
PART_NO
FROM INVENTORY_TRANSACTION_HIST_TAB WHERE TRANSACTION_CODE !='NISS' or TRANSACTION_CODE != 'NREC';

он по-прежнему возвращает номер детали 1012427, поскольку, очевидно, он имеет другие коды транзакций, которые не являются NISS или NREC.

Ответы [ 3 ]

2 голосов
/ 01 мая 2019

Здесь на помощь приходят аналитические функции:

SELECT part_no,
       <other columns>
FROM   (SELECT part_no,
               <other columns>,
               max(CASE WHEN transaction_code IN ('NISS', 'NREC') THEN 1 ELSE 0 end) OVER (PARTITION BY part_no) invalid_code_present
        FROM   inventory_transaction_hist_tab)
WHERE  invalid_code_present = 0;

Подзапрос находит максимальное значение 1 для каждого part_no, если любая из строк для этого part_no имеет код транзакции NISS или NREC. Это значение возвращается для всех строк.

Затем внешний запрос фильтрует результаты, чтобы включить только строки part_no, в которых нет строк с исключенными кодами транзакции.

N.B. Я предположил, что вам нужно больше информации из строк, чем просто part_no. Если это не так, то агрегированный запрос должен помочь:

SELECT part_no
FROM   inventory_transaction_hist_tab
GROUP BY part_no
HAVING MAX(CASE WHEN transaction_code IN ('NISS', 'NREC') THEN 1 ELSE 0 END) = 0;
2 голосов
/ 01 мая 2019

Если вы только хотите получить номер детали и только отдельные значения - поэтому вы видите только один результат для 1001709, а не 6, тогда вы можете использовать условное агрегирование:

select part_no
from inventory_transaction_hist_tab
group by part_no
having max(case when transaction_code in ('NISS', 'NREC') then transaction_code end) is null;

Если вы хотите просмотреть все строки для 1001709, тогда альтернативой запросу @ scaisEdge является использование not exists:

select part_no, transaction_code
from inventory_transaction_hist_tab t1
where not exists (
  select *
  from inventory_transaction_hist_tab t2
  where t2.part_no = t1.part_no
  and t2.transaction_code in ('NISS', 'NREC')
);

. Вы можете попробовать оба варианта и посмотреть, какие из них работают лучше.Или @ Boneist's, преимущество которого состоит в том, что вы только один раз попадаете в таблицу, что, вероятно, компенсирует любые издержки аналитической функции.

1 голос
/ 01 мая 2019

Вы можете попробовать использовать не в коде с NISS и NREC

  SELECT
  PART_NO 
  FROM INVENTORY_TRANSACTION_HIST_TAB
  WHERE PART_NO NOT IN (
    SELECT
    PART_NO 
    FROM INVENTORY_TRANSACTION_HIST_TAB
    WHERE TRANSACTION_CODE IN ('NISS','NREC')
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...