Использование NOT LIKE для выбора списка номеров, которые не работают должным образом - Oracle SQL - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь извлечь список серийных номеров, где соответствующий им номер детали НИКОГДА не может иметь маркировку -INTERNAL.

Способ, которым моя строительная компания выполняет производственные заказы, заключается в том, что один серийный номер может быть переведен на другой номер детали через x заказов. Я пытаюсь отслеживать ТОЛЬКО серийные номера, которые НИКОГДА не имели обозначения -INTERNAL на любом из его номеров деталей.

Ниже приведен пример данных, с которыми я работаю:

| Serial | Make_Order_Number |   Part_Number  |
|:------:|:-----------------:|:--------------:|
|   400  |       MO321       |      NB332     |
|   400  |       MO333       |      NB333     |
|   400  |       MO311       | NB334-INTERNAL |
|   92   |       MO222       |      NB122     |
|   92   |       MO299       |      NB123     |
|   92   |       MO212       |      NB124     |
|   545  |       MO214       |      NB092     |
|   774  |       MO215       | NB093-INTERNAL |
|   774  |       MO200       | NB093-INTERNAL |
|   774  |       MO218       |      NB833     |
|   987  |       MO110       |      NB741     |

В идеале хотелось бы получить:

| Serial |
|:------:|
|   92   |
|   545  |
|   987  |

Я пытался написать

SELECT DISTINCT Serial
FROM tblParts
WHERE Part_Number NOT LIKE '%-INTERNAL%'

но это дает мне:

| Serial |
|:------:|
|   92   |
|   400  |    
|   545  |
|   774  |
|   987  |

потому что в один момент serial 400 имел номер детали, который удовлетворял этому условию. Любой совет приветствуется.

Ответы [ 3 ]

2 голосов
/ 27 июня 2019

Вы можете сделать это без самостоятельного объединения, используя условную сумму, например:

WITH your_table AS (SELECT 400 serial, 'MO321' make_order_number, 'NB332' part_number FROM dual UNION ALL
                    SELECT 400 serial, 'MO333' make_order_number, 'NB333' part_number FROM dual UNION ALL
                    SELECT 400 serial, 'MO311' make_order_number, 'NB334-INTERNAL' part_number FROM dual UNION ALL
                    SELECT 92 serial, 'MO222' make_order_number, 'NB122' part_number FROM dual UNION ALL
                    SELECT 92 serial, 'MO299' make_order_number, 'NB123' part_number FROM dual UNION ALL
                    SELECT 92 serial, 'MO212' make_order_number, 'NB124' part_number FROM dual UNION ALL
                    SELECT 545 serial, 'MO214' make_order_number, 'NB092' part_number FROM dual UNION ALL
                    SELECT 774 serial, 'MO215' make_order_number, 'NB093-INTERNAL' part_number FROM dual UNION ALL
                    SELECT 774 serial, 'MO200' make_order_number, 'NB093-INTERNAL' part_number FROM dual UNION ALL
                    SELECT 774 serial, 'MO218' make_order_number, 'NB833' part_number FROM dual UNION ALL
                    SELECT 987 serial, 'MO110' make_order_number, 'NB741' part_number FROM dual)
SELECT serial
FROM   your_table
GROUP BY serial
HAVING SUM(CASE WHEN part_number LIKE '%-INTERNAL%' THEN 1 ELSE 0 END) = 0
ORDER BY serial;

    SERIAL
----------
        92
       545
       987

Это работает, если поставить 1, если номер детали содержит "-INTERNAL", и 0 в противном случае, затемсуммируя эти числа для каждого серийного номера и исключая те, которые имеют сумму> 0.

Этот запрос может быть, а может и не быть быстрее, чем запрос на самообъединение - вы должны проверить как свои данные, так и посмотреть, какие из нихработает лучше для вас.

2 голосов
/ 27 июня 2019

Вы можете GROUP BY serial и фильтровать по группам HAVING без экземпляров с внутренней частью.

Установка Oracle :

CREATE TABLE tblParts ( Serial, Make_Order_Number, Part_Number ) AS
  SELECT 400, 'MO321', 'NB332' FROM DUAL UNION ALL
  SELECT 400, 'MO333', 'NB333' FROM DUAL UNION ALL
  SELECT 400, 'MO311', 'NB334-INTERNAL' FROM DUAL UNION ALL
  SELECT  92, 'MO222', 'NB122' FROM DUAL UNION ALL
  SELECT  92, 'MO299', 'NB123' FROM DUAL UNION ALL
  SELECT  92, 'MO212', 'NB124' FROM DUAL UNION ALL
  SELECT 545, 'MO214', 'NB092' FROM DUAL UNION ALL
  SELECT 774, 'MO215', 'NB093-INTERNAL' FROM DUAL UNION ALL
  SELECT 774, 'MO200', 'NB093-INTERNAL' FROM DUAL UNION ALL
  SELECT 774, 'MO218', 'NB833' FROM DUAL UNION ALL
  SELECT 987, 'MO110', 'NB741' FROM DUAL;

Запрос :

SELECT Serial
FROM   tblParts
GROUP BY Serial
HAVING COUNT( CASE WHEN Part_Number LIKE '%-INTERNAL%' THEN 1 END ) = 0

Выход :

| SERIAL |
| -----: |
|    987 |
|    545 |
|     92 |

db <> скрипка здесь

2 голосов
/ 27 июня 2019
SELECT DISTINCT Serial
FROM tblParts
WHERE Serial 
NOT IN 
(SELECT Serial 
FROM tblParts 
WHERE Part_Number 
LIKE '%-INTERNAL%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...