使用“不喜欢”选择未按预期执行的数字列表-Oracle SQL

使用“不喜欢”选择未按预期执行的数字列表-Oracle SQL,sql,oracle,Sql,Oracle,我正在尝试提取序列号列表,其中对应的零件号永远不能有-内部标记 我的建筑公司制作生产订单的方式是,单个序列号可以跨x个订单转换为不同的零件号。我试图只跟踪从未在其任何零件号上有-内部标记的序列号 以下是我正在处理的数据示例: | Serial | Make_Order_Number | Part_Number | |:------:|:-----------------:|:--------------:| | 400 | MO321 | NB332

我正在尝试提取序列号列表,其中对应的零件号永远不能有
-内部标记

我的建筑公司制作生产订单的方式是,单个序列号可以跨x个订单转换为不同的零件号。我试图只跟踪从未在其任何零件号上有
-内部
标记的序列号

以下是我正在处理的数据示例:

| 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
确实有一个符合该条件的零件号。任何建议都将不胜感激。

您可以通过使用条件和(例如:

SELECT DISTINCT Serial
FROM tblParts
WHERE Serial 
NOT IN 
(SELECT Serial 
FROM tblParts 
WHERE Part_Number 
LIKE '%-INTERNAL%')
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
如果零件号包含“-INTERNAL”,则取1,否则取0,然后将每个序列的编号相加,排除总和大于0的编号


此查询可能比自联接查询快,也可能比不上自联接查询快-您应该根据您的数据测试这两个查询,并查看哪一个查询最适合您。

您可以
按序列分组
并按组过滤
中没有内部部分的实例

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 | 查询

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 | 输出

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 | |连载| | -----: | | 987 | | 545 | | 92 |
dbfiddle

不幸的是,这会产生与以前相同的结果。没问题。还是一样的结果。我想这是因为一个序列号可以有一个零件号,它既是一个
间隔,又是一个非间隔。很可能有人会抢先我一步,但我会很快加载它,看看我是否能得到它。。。