首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL如何查找在同一个表中不存在的值?

SQL如何查找在同一个表中不存在的值?
EN

Stack Overflow用户
提问于 2020-11-20 23:56:19
回答 2查看 43关注 0票数 0

所以我们有列order_number,product_name,product_number,product_type。product_type有两种类型,semi和finish,订单号以S开头,而finish类型的订单号以F开头。订单号类似于S123、F123。半成品订单号和成品订单号完全相同,除了起始件的SXXX表示Semi,FXXX表示成品类型。它们共享相同的产品名称和产品编号,但可以有1个semi、1个finish或只有1个semi,每个产品编号对应1个finish产品。如何查询才能找到只存在于半成品中而未完成的产品?

我想问一下

代码语言:javascript
运行
复制
SELECT ORDER_NUMBER, PRODUCT_NAME, PRODUCT_NUMBER
FROM TABLE A
WHERE PRODUCT_TYPE = 'SEMI'; 

但这并不表明该产品是否只存在于semi而不是finish中。我该怎么做呢?我不能只使用PRODUCT_TYPE NOT IN ('FINISH'),因为它们的订单号是不同的,唯一匹配的是产品名称和产品编号。

帮助。:(

EN

回答 2

Stack Overflow用户

发布于 2020-11-21 00:02:31

以下是SUBSTR函数删除第一个字符( S,F)的一种方法,您可以比较产品编号以查看是否有任何抛光类型:

代码语言:javascript
运行
复制
SELECT
    ORDER_NUMBER
    , PRODUCT_NAME
    , PRODUCT_NUMBER
FROM
    Table1 A
WHERE
    PRODUCT_TYPE = 'SEMI'
    AND NOT EXISTS
    (
        SELECT
            1
        FROM
            Table1 F
        WHERE
            F.PRODUCT_TYPE = 'FINISH'
            AND SUBSTR( A.PRODUCT_NUMBER, 2) = SUBSTR(F.PRODUCT_NUMBER, 2)
    );
票数 0
EN

Stack Overflow用户

发布于 2020-11-21 00:10:05

以下是使用COUNT()分析函数检查每个产品名称和编号中的SEMI和FINISH行的计数的一种方法:

代码语言:javascript
运行
复制
with table_a as (select 'S1' order_number, 'A' product_name, 1 product_number, 'SEMI' product_type from dual union all
                 select 'F1' order_number, 'A' product_name, 1 product_number, 'FINISH' product_type from dual union all
                 select 'S2' order_number, 'B' product_name, 2 product_number, 'SEMI' product_type from dual union all
                 select 'F3' order_number, 'C' product_name, 3 product_number, 'FINISH' product_type from dual)
select order_number,
       product_name,
       product_number,
       product_type
from   (select order_number,
               product_name,
               product_number,
               product_type,
               case when count(case when product_type = 'SEMI' then 1 end) over (partition by product_name, product_number) > 0 then 'Y' else 'N' end semi_present,
               case when count(case when product_type = 'FINISH' then 1 end) over (partition by product_name, product_number) > 0 then 'Y' else 'N' end finish_present
        from   table_a)
where  semi_present = 'Y'
and    finish_present = 'Y';

ORDER_NUMBER PRODUCT_NAME PRODUCT_NUMBER PRODUCT_TYPE
------------ ------------ -------------- ------------
S1           A                         1 SEMI
F1           A                         1 FINISH

不过,我有点担心您的表结构;这似乎非常不规范(您通常会有一个包含产品信息的表,其中包含某种引用每个产品的id,然后通过id列连接到该product表)。我希望这是对您已简化的几个表的查询的简化版本。

附注:以后请在你的问题中提供一些样本数据。你可以看到,我不得不自己编造一些数据,我不得不猜测。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64932662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档