【问题标题】:Problems with a RPG Distinct and Join SQL statementRPG Distinct 和 Join SQL 语句的问题
【发布时间】:2019-10-03 15:10:06
【问题描述】:

我有两个数据库,我正在尝试加入并从中获取不同的值。一个表包含订购商品的列表,另一种类型包含有关商品的更多信息。我只使用 Join 来做一个额外的 where 语句检查。问题是,如果在 SQL 语句运行期间和游标打开后该值发生更改,它似乎不遵守项目详细信息文件中的 where 语句检查。

SELECT DISTINCT 
    OrdItem                                            
FROM
    OrdMst 
INNER JOIN 
    ItmMst ON OrdMst.OrdItem = ItmMst.Item              
WHERE 
    OrdMst.ID = 'MR' 
    AND OrdMst.TYPE = 'F' 
    AND ItmMst.ItmType IN ('1', '2') 
ORDER BY 
    OrdMst.OrdItem;

【问题讨论】:

    标签: sql join ibm-midrange db2-400


    【解决方案1】:

    我没有看到任何 RPG..

    假设您在 RPG 中将张贴语句用作 DECLARE CURSOR 语句的一部分,那么还有其他子句可以控制光标行为。

    来自documentation
    ASENSITIVE(默认)
    指定游标可能表现为 SENSITIVE 或 INSENSITIVE 取决于选择语句的优化方式。

    敏感
    指定打开游标后对数据库所做的更改是 在结果表中可见。光标对任何物体都有一定程度的敏感性 之后对其结果表下的行进行更新或删除 光标打开。游标始终对定位更新或 使用相同的光标删除。此外,光标可以具有灵敏度 在此光标之外所做的更改。如果数据库管理器无法使 更改对光标可见,则返回错误。数据库 当光标移动时,管理器无法使更改对光标可见 隐式变为只读。 (请参阅游标的结果表。)如果 SENSITIVE 是 指定时,SELECT 语句不能包含数据更改表引用。

    不敏感
    指定一旦打开游标,它就对 此激活或任何其他激活执行的插入、更新或删除 团体。如果指定了 INSENSITIVE,则游标是只读的,并且 打开游标时会创建临时结果。除此之外 SELECT 语句不能包含 UPDATE 子句和应用程序 必须允许数据的副本 (ALWCPYDTA(*OPTIMIZE) 或 ALWCPYDTA(*YES))。

    【讨论】:

      【解决方案2】:

      最好将任何单个数据库语句视为即时活动。数据库收集所有结果并为您提供一个游标,以便您可以遍历这些结果(例如,请参阅选择部分 here)。在 postgres 中(我会默认在其他地方假设),结果集不会与数据库一起发生变化。 DB2 用户应该看到来自@Charles(下)的answer,因为 DB2 显然支持变异结果。

      请注意,大多数数据库包对结果集使用“惰性”评估。这使您可以在不重复评估查询的情况下执行添加条件和排序语句等操作。如果您认为您看到了突变,这可能是由于您的查询执行延迟所致。

      我们通常不期望/希望数据库以不同的方式工作。作为一个简单的例子,想象一个你正在对记录进行操作的情况。您选择记录并按 last_modified 排序。你对记录做了一些事情并更新了 last_modified。如果记录集发生突变,则操作将永远无法完成,因为您会一直将修改的内容粘贴在记录集的末尾。

      由于记录集没有发生变异,您试图实现的目标是什么?鉴于数据库不变(我们称之为XY problem),您最好询问如何实现该目标。

      【讨论】:

      • 没有真正的问题试图解决只是测试一个程序并注意到这种情况。让我感到困惑的是,如果我将 ItmMst.ItmType 添加到字段选择列表中,它就会正常运行。 SELECT DISTINCT OrdItem, ItmMst.ItmType 从 OrdMst INNER JOIN ItmMst ON OrdMst.OrdItem = ItmMst.Item WHERE OrdMst.ID = 'MR' AND OrdMst.TYPE = 'F' AND ItmMst.ItmType IN ('1', '2') ORDER BY OrdMst.OrdItem;
      • 同一个OrdItem可以有多个ItmMst吗?否则,我想不出有什么理由会改变结果。
      • 我添加了一个关于惰性评估的注释和一个资源链接,该链接证实了我对 SELECT 的理解(至少在 Postgres 上)。也许这可以解释为什么你会在测试中看到不同的东西。
      • 谢谢。我完全同意添加额外的输入字段会得到不同的答案只是很奇怪,但我想因为它需要重新评估它是否仍然满足 where 子句的字段。
      • Charles 的回答是关于 DB2 而不是 MSSQL。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 2017-02-06
      相关资源
      最近更新 更多