gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:35:12 26 4
gpt4 key购买 nike

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

从技术意义上讲,我的要求是左侧连接,其中右侧为“空”(也称为排除连接),在 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 逻辑与“所有条目”一起使用,但是 我仍然想知道是否可以使用子查询的结果来检查多个字段或在多个字段上使用另一种形式的排除连接逻辑 使用 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
)

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

这是上下文有助于理解问题的地方:
  • 初始要求:全部拉取 vendors , 无财务记录 3
    表。
  • 附加要求:也排除基于替代payers ( 1-* 关系)。这就是上面的例子所基于的。
  • 更多要求:也排除基于替代payee ( *-* payerpayee 之间的关系)。

  • 多对多连接成倍增加了我标记为 XXXX 的构造中的记录数。 ,这反过来又会产生很多不必要的工作。例如:单个客户有 3 payers , 和 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 个好的子查询,看起来不错)。

  • 无论如何,欢迎对此有任何其他见解。

    编辑2 :虽然这有点偏离主题,但考虑到我的问题是关于子查询的,我想我会发布更新。一年多后,我不得不重新审视我致力于扩展它的解决方案。我了解到 适当排除连接工程 .我只是第一次实现它就失败了。
    select header~key 
    from headers left join items on headers~key = items~key
    where items~key is null

    关于subquery - 选择多个字段不在子查询中的位置(不包括连接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50266651/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com