HANA SQL如何检查三个表并提供布尔结果

2020-08-14 13:23发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨团队

我有三个表,所有表中都有part_serial_no列。

1)GRN(收货通知)

2)Delivery_Note

3)发票

当经销商收到part_number时,我们将GRN设为相同。

例如:对于零件号:PA100和经销商:AMAD12,我们在GRN表中为part_serial_no列提供值'AMA100X01'

下一次当同一经销商:AMAD12收到PA100时,序列号将为" AMA100X02",即每个part_no都具有相同经销商的唯一序列号。

现在我有一个条件,在创建序列号为'AMA100X01'的GRN之前,我希望使用SQL查询检查此序列号是否在交货单和发票表中,其中输出应为布尔值TRUE

1)如果交货单和发票中不存在序列号。

2)如果交货单和发票中存在序列号,但经销商不同。

输出值为False

1)如果同一经销商的交货单和发票表中存在序列号。

我已经在使用以下查询

选择
 案件
 什么时候
 存在(从TOP 1 * FROM GRN WHERE PART_SERIAL_NO ='AMA100X01')
 然后"正确"
 否则为"假"
 结束
 AS GRN_EXIST,
 案件
 什么时候
 存在(选择前1 *从DELIVERY_NOTE PART_SERIAL_NO ='AMA100X01')
 然后"正确"
 否则为"假"
 结束
 如DNOTE_EXIST,
 案件
 什么时候
 存在(从TOP 1 * *在发票PART_SERIAL_NO ='AMA100X01'的情况下)
 然后"正确"
 否则为"假"
 结束
 AS INVOICE_EXIST
 从EQS_GRN,其中USER_ID ='MR200'和PART_SERIAL_NO ='AMA100X01'
 

并获得如下输出。

但是实际上我想以这样一种方式来构建查询:我根据上面定义的条件得到一个单列和一行,其布尔值为True或False。

致谢

Govardan

(5.3 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨团队

我有三个表,所有表中都有part_serial_no列。

1)GRN(收货通知)

2)Delivery_Note

3)发票

当经销商收到part_number时,我们将GRN设为相同。

例如:对于零件号:PA100和经销商:AMAD12,我们在GRN表中为part_serial_no列提供值'AMA100X01'

下一次当同一经销商:AMAD12收到PA100时,序列号将为" AMA100X02",即每个part_no都具有相同经销商的唯一序列号。

现在我有一个条件,在创建序列号为'AMA100X01'的GRN之前,我希望使用SQL查询检查此序列号是否在交货单和发票表中,其中输出应为布尔值TRUE

1)如果交货单和发票中不存在序列号。

2)如果交货单和发票中存在序列号,但经销商不同。

输出值为False

1)如果同一经销商的交货单和发票表中存在序列号。

我已经在使用以下查询

选择
 案件
 什么时候
 存在(从TOP 1 * FROM GRN WHERE PART_SERIAL_NO ='AMA100X01')
 然后"正确"
 否则为"假"
 结束
 AS GRN_EXIST,
 案件
 什么时候
 存在(选择前1 *从DELIVERY_NOTE PART_SERIAL_NO ='AMA100X01')
 然后"正确"
 否则为"假"
 结束
 如DNOTE_EXIST,
 案件
 什么时候
 存在(从TOP 1 * *在发票PART_SERIAL_NO ='AMA100X01'的情况下)
 然后"正确"
 否则为"假"
 结束
 AS INVOICE_EXIST
 从EQS_GRN,其中USER_ID ='MR200'和PART_SERIAL_NO ='AMA100X01'
 

并获得如下输出。

但是实际上我想以这样一种方式来构建查询:我根据上面定义的条件得到一个单列和一行,其布尔值为True或False。

致谢

Govardan

(5.3 kB)
付费偷看设置
发送
1条回答
梦想连接
1楼 · 2020-08-14 14:00.采纳回答

不确定我是否完全理解了您的逻辑,所以我只是按您提供的代码进行操作。

这样的事情可能会发生:

 part_serial_exists为
     (选择
          用户身份
        ,PART_SERIAL_NO
        ,'TRUE'found_all_entries
      从
         EQS_GRN
     哪里
           USER_ID ='MR200'
      AND PART_SERIAL_NO ='AMA100X01'
      AND(
             存在(SELECT * FROM INVOICE WHERE PART_SERIAL_NO = EQS_GRN.PART_SERIAL_NO)
         和存在(SELECT * FROM DELIVERY_NOTE PART_SERIAL_NO = EQS_GRN.PART_SERIAL_NO)
         和存在(从GRN WHERE PART_SERIAL_NO = EQS_GRN.PART_SERIAL_NO中选择*)
         )
     )
 选择
       EQS_GRN.USER_ID
     ,EQS_GRN.PART_SERIAL_NO
     ,COALESCE(pse.found_all_entries,'FALSE')为found_all_entries
 从
     EQS_GRN
     左外连接part_serial_exists pse
     开启(EQS_GRN.USER_ID,EQS_GRN.PART_SERIAL_NO)=
        (pse.USER_ID,pse.PART_SERIAL_NO)
 哪里
       USER_ID ='MR200'
  AND PART_SERIAL_NO ='AMA100X01';
 

当且仅当满足所有三个EXISTS条件时,公用表表达式" part_serial_exists"才返回TRUE,并返回USER_ID和PART_SERIAL_NO的组合(希望是唯一键)。

主要 查询,然后从EQS_GRN表中进行选择,并针对CTE进行LEFT OUTER JOIN,如果未找到匹配项,则将FALSE放在FOUND_ALL_ENTRIES列中。

BTW:无需在EXISTS中乱码 子句之类的东西,如TOP 1 ... HANA查询优化器了解您想对EXISTS进行的操作。 甚至在这里选择哪几列都没有关系-所有考虑的就是是否有匹配的记录。

一周热门 更多>