RPG Distinct and Join SQL 语句的问题
Problems with a RPG Distinct and Join SQL statement
我有两个数据库,我正在尝试加入它们并从中获取不同的值。一种 table 包含订购商品的列表,另一种包含有关该商品的更多信息。我只使用 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;
最好将任何单个数据库语句视为瞬时 activity。数据库收集所有结果并为您提供一个游标,以便您可以遍历这些结果(例如,请参阅@Charles(下方)的 select 部分 here). In postgres (and I would assume by default elsewhere), the result set isn't mutating along with the database. DB2 users should see the ,因为 DB2 显然支持变异结果。
请注意,大多数数据库包使用 "lazy" 结果集评估。这使您无需重复评估查询即可执行添加条件和排序语句等操作。如果您认为自己看到了突变,那可能是由于您的查询执行延迟所致。
我们通常 expect/want 数据库以不同方式工作。作为原因的一个简单示例,想象一下您正在对记录进行操作的情况。您 select 记录并按 last_modified 订购。您对记录进行了一些操作并更新了 last_modified。如果记录集发生变化,操作将永远无法完成,因为您会一直将修改的内容粘贴在记录集的末尾。
由于记录集未发生变化,您想要实现的目标是什么?你最好询问如何根据不变的数据库实现该目标(我们称之为 XY problem)。
我没有看到任何角色扮演游戏..
假设您将发布的语句用作 RPG 中 DECLARE CURSOR
语句的一部分,那么还有控制游标行为的附加子句。
来自documentation
ASENSITIVE(默认)
指定游标可能表现为 SENSITIVE 或 INSENSITIVE
取决于 select 语句的优化方式。
敏感
指定打开游标后对数据库所做的更改是
在结果中可见 table。光标对任何东西都有一定程度的敏感性
更新或删除其结果 table 之后的行
游标被打开。游标总是对定位更新或
使用相同的游标删除。此外,光标可以具有灵敏度
在此游标之外所做的更改。如果数据库管理器不能
更改对光标可见,然后返回错误。数据库
当游标出现时,管理器无法使游标可见更改
隐式变为只读。 (参见游标的结果 table。)如果 SENSITIVE 是
指定后,SELECT 语句不能包含数据更改-table-引用。
不敏感
指定一旦游标打开,它对
由这个或任何其他激活执行的插入、更新或删除
团体。如果指定了 INSENSITIVE,则游标是只读的并且是
打开游标时创建临时结果。除此之外
SELECT 语句不能包含 UPDATE 子句和应用程序
必须允许数据的副本 (ALWCPYDTA(*OPTIMIZE) 或
ALWCPYDTA(*YES)).
我有两个数据库,我正在尝试加入它们并从中获取不同的值。一种 table 包含订购商品的列表,另一种包含有关该商品的更多信息。我只使用 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;
最好将任何单个数据库语句视为瞬时 activity。数据库收集所有结果并为您提供一个游标,以便您可以遍历这些结果(例如,请参阅@Charles(下方)的 select 部分 here). In postgres (and I would assume by default elsewhere), the result set isn't mutating along with the database. DB2 users should see the
请注意,大多数数据库包使用 "lazy" 结果集评估。这使您无需重复评估查询即可执行添加条件和排序语句等操作。如果您认为自己看到了突变,那可能是由于您的查询执行延迟所致。
我们通常 expect/want 数据库以不同方式工作。作为原因的一个简单示例,想象一下您正在对记录进行操作的情况。您 select 记录并按 last_modified 订购。您对记录进行了一些操作并更新了 last_modified。如果记录集发生变化,操作将永远无法完成,因为您会一直将修改的内容粘贴在记录集的末尾。
由于记录集未发生变化,您想要实现的目标是什么?你最好询问如何根据不变的数据库实现该目标(我们称之为 XY problem)。
我没有看到任何角色扮演游戏..
假设您将发布的语句用作 RPG 中 DECLARE CURSOR
语句的一部分,那么还有控制游标行为的附加子句。
来自documentation
ASENSITIVE(默认)
指定游标可能表现为 SENSITIVE 或 INSENSITIVE
取决于 select 语句的优化方式。
敏感
指定打开游标后对数据库所做的更改是
在结果中可见 table。光标对任何东西都有一定程度的敏感性
更新或删除其结果 table 之后的行
游标被打开。游标总是对定位更新或
使用相同的游标删除。此外,光标可以具有灵敏度
在此游标之外所做的更改。如果数据库管理器不能
更改对光标可见,然后返回错误。数据库
当游标出现时,管理器无法使游标可见更改
隐式变为只读。 (参见游标的结果 table。)如果 SENSITIVE 是
指定后,SELECT 语句不能包含数据更改-table-引用。
不敏感
指定一旦游标打开,它对
由这个或任何其他激活执行的插入、更新或删除
团体。如果指定了 INSENSITIVE,则游标是只读的并且是
打开游标时创建临时结果。除此之外
SELECT 语句不能包含 UPDATE 子句和应用程序
必须允许数据的副本 (ALWCPYDTA(*OPTIMIZE) 或
ALWCPYDTA(*YES)).