使用“不喜欢”选择未按预期执行的数字列表-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不幸的是,这会产生与以前相同的结果。没问题。还是一样的结果。我想这是因为一个序列号可以有一个零件号,它既是一个间隔,又是一个非间隔。很可能有人会抢先我一步,但我会很快加载它,看看我是否能得到它。。。