Вы можете сделать это без самостоятельного объединения, используя условную сумму, например:
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.
Этот запрос может быть, а может и не быть быстрее, чем запрос на самообъединение - вы должны проверить как свои данные, так и посмотреть, какие из нихработает лучше для вас.