选择多个字段不在子查询中的位置(不包括连接)

2023-12-03

我需要提取存档表中没有历史记录的记录。需要在存档中检查 1 条记录的 2 个字段。

从技术意义上讲,我的要求是左连接,其中右侧为“空”(又名排除连接),在abap openSQL中通常是这样实现的(无论如何对于我的场景):

Select * from xxxx            //xxxx is a result for a multiple table join
where xxxx~key not in         (select key from archive_table where [conditions] ) 
  and xxxx~foreign_key not in (select key from archive_table where [conditions] )

这 2 个字段还会针对另外 2 个表进行检查,因此这意味着总共有 6 个子查询。

我以前使用过的数据库引擎通常有一些方法来处理此类问题(例如排除连接或外部应用)。

对于这个特殊情况,我将尝试使用 ABAP 逻辑和“for allentries”,但是我仍然想知道是否可以使用子查询的结果来检查多个字段或使用另一种形式排除多个字段上的联接逻辑使用SQL(不涉及应用程序服务器)。


我在我正在编写的程序的生命周期中测试了相当多的子查询变体。NOT EXISTS在某些情况下,基于 2 个键的多字段检查(下面的简化示例)可以排除。 性能可以接受(处理时间约为 5 秒),但在基于 1 个字段进行排除时,它明显比相同查询慢。

Select * from xxxx            //xxxx is a result for a multiple table inner joins and 1 left join ( 1-* relation )
where NOT EXISTS  (
   select key from archive_table 
   where key = xxxx~key OR key = XXXX-foreign_key 
) 

EDIT:随着需求的变化(更多过滤),很多都发生了变化,所以我想我会更新它。我标记为的构造XXXX在我的示例中包含一个左连接(其中主表到辅助表的关系是1-*)并且出现得相对较快。

这是上下文有助于理解问题的地方:

  • 初始要求:全部拉取vendors, 没有财务记录 3 表。
  • 附加要求:也根据替代方案排除payers (1-*关系)。这就是上面例子的基础。
  • 更多要求:也根据替代方案排除payee (*-*之间的关系payer and payee).

多对多连接呈指数增加了我标记的构造中的记录计数XXXX,这反过来又产生了很多不必要的工作。例如:一个客户有 3 个payers, and 3 payees生成了 9 行,总共有 27 个字段需要检查(每行 3 个),而实际上只有 7 个唯一值。

此时,将左连接表从主查询移动到子查询中并将它们分开提供了明显更好的性能。 比任何看起来更聪明的替代品。

select * from lfa1 inner join lfb1 
       where 
          ( lfa1~lifnr not in ( select lifnr from bsik where bsik~lifnr = lfa1~lifnr )
       and lfa1~lifnr not in ( select wyt3~lifnr from wyt3 inner join t024e on wyt3~ekorg = t024e~ekorg and wyt3~lifnr <> wyt3~lifn2
                                                        inner join bsik  on bsik~lifnr = wyt3~lifn2 where wyt3~lifnr = lfa1~lifnr and t024e~bukrs = lfb1~bukrs  )
       and lfa1~lifnr not in ( select lfza~lifnr from lfza inner join bsik  on bsik~lifnr = lfza~empfk where lfza~lifnr = lfa1~lifnr )
          )
           and [3 more sets of sub queries like the 3 above, just checking different tables].

我的结论:

  • 当排除基于单个字段时,两者not in/not exits工作。一种可能比另一种更好,具体取决于您使用的过滤器。
  • 当排除基于 2 个或更多字段并且主查询中没有多对多联接时,not exists ( select .. from table where id = a.id or id = b.id or... )似乎是最好的。
  • 当您的排除标准在主查询中实现多对多关系时,我建议您寻找一种最佳方法来实现多个子查询(即使为每个键表组合使用子查询也会比带有 1 个良好子查询的多对多连接,看起来不错)。

无论如何,欢迎对此有任何额外的见解。

EDIT2:虽然这有点偏离主题,但考虑到我的问题是关于子查询的,我想我会发布更新。一年多后,我不得不重新审视我正在开发的解决方案来扩展它。我了解到正确排除连接工程。我第一次实施它时就非常失败。

select header~key 
from headers left join items on headers~key = items~key
where items~key is null
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

选择多个字段不在子查询中的位置(不包括连接) 的相关文章

  • 如何跳过选择屏幕上的必填字段?

    我希望当我单击 Iptal 按钮时它跳过必填字段 但我不想在没有 强制 的情况下控制强制字段 我想在文本框中看到复选标记 例如屏幕截图 通常 当没有必填字段时 Iptal 按钮会调用不同的屏幕 注意 屏幕是标准选择屏幕 我解决这个问题的方法
  • 如何在屏幕退出时隐藏有条件的自定义字段?

    我的任务是自定义标题详细信息屏幕ME33K交易 目标是添加一个包含新字段的框 仅当协议类型是我使用交易定义的类型时才应显示该框SPRO 例如 协议类型ABC 我开始使用CMOD交易中 我创建了一个虚拟框和带有一些硬编码输入值的字段 并且工作
  • MySQL:在多个子查询中使用“In”?

    我正在尝试使用这个查询 SELECT COUNT PF PageID AS Total P PageID FROM Pages P LEFT JOIN Pages Filters PF ON PF PageID P PageID WHERE
  • 如何使用 IF EXIST 条件检查目录或文件是否存在?

    如何检查目录或文件是否存在IF EXIST健康 状况 Such as If exist C Windows OR C Windows2 rem Do something else rem Something else 我该怎么做 简单例子1
  • SQL:选择行不符合同一表内条件的事务

    我有一张包含交易的表 Transactions id account type date time amount 1 001 R 2012 01 01 10 01 00 1000 2 003 R 2012 01 02 12 53 10 15
  • 如何将 SQL 结果集限制为不太常见的项目

    问题 我有一份姓名和地址列表 有些姓名 人 与其他姓名 人 具有相同的地址 街道 邮政编码 城镇 我想选择所有这些名称 其地址出现次数不超过三次 并从其余名称中选择前三个名称 每个名称都指向同一地址 例子 Albert Adr1 Berta
  • Android File.exists() 不区分大小写吗?

    我创建了一个新文件夹 sdcard dd by File album new File albumPath if album exists Log d TAG albumPath already exists else boolean bF
  • 使用变量查询

    是否可以在查询中设置 读取变量 伪代码 SELECT animal name tallest animal select top 1 height from animal order by height desc as tallest sm
  • JPA - COUNT 的最大值或从 SELECT 中选择

    我为 MySQL 编写了以下查询 SELECT subquery t1 column1 subquery t2 id MAX subquery val FROM SELECT t1 column1 as t1 column1 t1 id t
  • SQL INNER JOINing 2 子查询

    我试图将这两个子查询 我认为这就是它的名字 内部联接在一起 其中第一个查询的branchName等于第二个查询的branchName 然而 他们似乎并不想联合起来 而且以我有限的 SQL 知识 我似乎找不到解决这个问题的方法 我尝试将括号移
  • 我可以使用 line_exists 检查初始值或不相等的值吗?

    ABAP 7 40 添加了line exists 谓词函数来分析内表 但我有什么办法可以检查是否存在特定列为初始值或与目标值不同的行 例如 如何检查具有初始材料列的行 例如此表中的第三行 Document Country Material
  • plpgsql 函数中 IF EXISTS 内部标识符的变量

    CREATE OR REPLACE FUNCTION drop now RETURNS void AS BODY DECLARE row record BEGIN RAISE INFO in FOR row IN select relnam
  • 如何等到File.Exists?

    我有一个应用程序 正在侦听所选文件夹中的 log 文件 我用了FileSystemWatcher 但有一个问题 负责制作该文件的另一个应用程序采取以下步骤 制作一个 gz 文件 解压到txt文件 一些随机文件名 将 txt 名称更改为带有
  • EFCore 3.1 - 通过 Any 存在查询;查询无法翻译

    我们使用 EFCore 3 1 并尝试通过跨越 2 个属性的 Any 使用 Exists 构建查询 var selectionCriteria someHugeList Select sh gt new sh Id sh StatusCod
  • 使用 cURL 检查 FTPS 站点上是否存在文件

    我正在使用 cURL 应用程序下载多个 csv 文件 我想找到一种方法来在开始下载之前检查文件是否存在于 ftps 站点上 如果它不存在 我想找到一种方法让 cURL 定期再次检查 我试图坚持使用 cURL 命令 因为我真的不擅长 Net
  • 调用 HTTP_POST 时出现 Bad Request 错误?

    我有一个关于 SAP 功能模块 http post 的问题 我只想将 SAP 中的一条短消息 msg 发布到我之前安装的推送通知服务器 pushd Github Projekt 现在我不知道如何传递消息 我用测试符号测试了 FM CALL
  • 如何使用带有 IF EXISTS 子查询的 SQL Select 语句?

    如何使用 IF EXISTS 语句 SQL Server 从子查询中选择布尔值 它应该是这样的 SELECT TABLE1 Id NewFiled IF EXISTS SELECT Id FROM TABLE2 WHERE TABLE2 I
  • 如果 netezza 中存在则删除

    我需要一个命令来删除表 如果存在 NETEZZA 类似这样的东西 drop table if exists xxx 我已经搜索并尝试了很多但没有成功 你能帮我一下吗 In netezza你可以使用这个语法 drop table table
  • 在包内的所有程序中搜索 MODIFY 语句

    我想搜索包内所有使用以下语句的程序 从 wa itab xyz 修改 itab xyz 最好使用通配符 如 itab 搜索字符串 对于一系列 itab values 如 itab abc itab def itab ghi ETC 我如何在
  • 使用子查询与 LEFT JOIN 一起选择 MAX 值

    我有一个获取搜索结果的查询 效果很好 查询成功示例 SELECT individuals individual id individuals unique id TIMESTAMPDIFF YEAR individuals day of b

随机推荐

  • pop_back()返回值?

    为什么不pop back 有返回值吗 我用谷歌搜索了一下这个问题 发现它可以提高效率 这是标准中如此规定的唯一原因吗 效率与之几乎没有关系 或者实际上没有关系 这个设计的结果是汤姆 卡吉尔的一篇重要论文上世纪 90 年代出版 当时引起了相当
  • Go类型用于函数调用

    关键词如go and defer期待一个函数调用作为参数 是否有可用的类型可以以相同的方式使用 例如 编写一个需要函数调用 而不是函数 作为参数的函数 不 那里没有 你不能对你的函数做同样的事情 go and defer由语言规范支持 并且
  • 授权从 Firebase Cloud Function 访问 Google Cloud Translate?

    我正在尝试编写一个调用 Google Cloud Translate 的 Firebase Cloud Function 我收到此错误 Error 7 PERMISSION DENIED Cloud IAM permission cloud
  • 使用离子和材料设计登录

    我有一个带有侧面菜单等的离子项目 现在我想以简单的方式添加并登录很酷的表单 例如http ionicmaterial com 但问题是我没有看到任何示例如何将其添加到令人兴奋的项目中 它将首先加载登录表单 然后重定向到常规页面 我的项目看起
  • 将一个整数随机分为 n 部分,可能的结果为零

    如何将一个整数随机划分为 n 个部分 且可能的结果为零 最好是R语言 例如 要将整数 5 分成 3 部分并执行 4 次 我可能会得到以下输出 1 4 0 1 2 2 2 1 3 0 2 3 4 1 1 3 Thanks library pa
  • 使用 Pandas 读取列数不规则的 CSV 文件

    我正在尝试读取一个 csv 文件 该文件不包含标题行 并且包含不确定数量的列和 pandas 我已经搜索了如何解决这个问题 但是我找到的所有答案都要求我已经知道 通过打开文件进行搜索 列可以拥有的最大数量并创建一个names 属性上read
  • Kotlin 小型演示 ACCESS_FINE_LOCATION

    改良版 以下代码显示如何访问 ACCESS FINE LOCATION 虽然比我的原始代码长 但它是首选 因为当应用程序暂停或停止时它会停止 GPS 更新 由于 Android Studio 模拟器的问题 它还包括一个简单的看门狗计时器 如
  • ImageSource 在 WPF 中使用数据库中的文件名

    我在 WPF 中有一个矩形 我可以使用以下命令设置它的填充
  • pyodbc.ProgrammingError:没有结果。以前的SQL在一次执行多个语句时不是查询

    我正在处理 sql server 数据库 我有一张名为 table1 包含 1 列和 1 行 exp num 0 我正在尝试更新0将 exp num 列值设置为 1 并返回旧实验和更新后的实验 为此 我使用声明语句 DECLARE Upda
  • python 中的快速 zip 解密

    我有一个使用以下方法处理 zip 文件的程序zipfile 它与一个iterator 因为未压缩的文件大于2GB它可能会成为一个记忆问题 with zipfile Zipfile BytesIO my file as myzip for f
  • 无法使 execfile() 变量成为全局变量而不是局部变量

    我有这个功能 This function loads the tokens for the specified account If the tokens are not found it quits the script def sele
  • 使用powershell批量重命名文件

    我可以使用以下命令批量重命名工作目录中的文件 Dir Rename Item NewName 0 0 wav f nr 但是我希望文件重命名以非零开始 说0500 然后按顺序重命名 Dir Rename Item NewName 0 500
  • C# 中按位桶移位左右旋转的问题

    在 C 中我有这样的代码 static UInt32 rol UInt32 value UInt32 bits bits 31 return value lt lt bits value gt gt 32 bits static UInt3
  • 将实体框架与 MySQL DB 结合使用,并且模型设计器不会获取存储的过程参数

    我有最新的 Mysql 连接器 允许您使用 Visual Studio 实体框架设计器 它运行得很好 但我刚刚添加了一个存储过程 服务器资源管理器使用指定的参数很好地加载了它 但后来我将它添加到实体模型中 它生成的代码没有任何输入参数 这是
  • 如何在 GitHub 上搜索以获得精确的字符串匹配,包括特殊字符

    我可以使用引号从 Google 搜索完全匹配的内容 例如 system lt lt 我如何为 GitHub 做同样的事情 你不能 2022年之前 官方GitHub搜索规则 由于搜索代码的复杂性 有一些限制 关于如何执行搜索 仅考虑默认分支
  • 如何在文本编辑器中包含 html 标签? [附片段]

    我正在使用文本编辑器 反应草案所见即所得 and 草稿js 到 html 而且我也将动态 html 注入到编辑器中 例如 索引 js export default function App const dynamicData div cla
  • MariaDB 版本 10.5.9 无法安装 [关闭]

    Closed 这个问题是与编程或软件开发无关 目前不接受答案 在我当前的工作场所中 我们使用 MariaDB 版本 10 5 9 作为我们的数据库 并且我们正在尝试重新安装此版本以在单独的容器上进行测试 然而 似乎以下 10 5 9 中的任
  • PowerShell 添加任务以使用参数运行 PowerShell 脚本

    我正在尝试从 PowerShell 脚本将任务添加到任务计划程序 该脚本将运行带有参数的 PowerShell 脚本 文件路径中的空格与整个命令周围的必要引号相冲突 并且 SCHTASKS 将 转换为 因此我无法正确封装 command P
  • Regex.Replace、String.Replace 或 StringBuilder.Replace 哪个最快?

    我需要全部更换System Environment Newline s 在我的函数返回的字符串中System Environment Newline t 因为我正在尝试应用缩进 并且我需要这样做几次 我的问题是哪一种是最有效的方法 我知道S
  • 选择多个字段不在子查询中的位置(不包括连接)

    我需要提取存档表中没有历史记录的记录 需要在存档中检查 1 条记录的 2 个字段 从技术意义上讲 我的要求是左连接 其中右侧为 空 又名排除连接 在abap openSQL中通常是这样实现的 无论如何对于我的场景 Select from x