【发布时间】:2023-02-18 04:11:48
【问题描述】:
我正在使用 Delphi 10.3 和 ZEOS 7.2.14 访问 Oracle 数据库。
我的一个查询只返回 1 条记录,而同一查询在 Oracle SQL Developer 中运行时返回很多行。
到目前为止,我已经使用子查询将问题缩小到 JOIN:
SELECT
zp.MELDEPUNKT
FROM TT_AP_MSCONS_RLM zp
LEFT OUTER JOIN TT_AP_MSCONS_RLM lv
ON (lv.MELDEPUNKT = zp.MELDEPUNKT)
返回多行。在 JOIN 中使用简单的子查询:
SELECT
zp.MELDEPUNKT
FROM TT_AP_MSCONS_RLM zp
LEFT OUTER JOIN (
SELECT
MELDEPUNKT
FROM TT_AP_MSCONS_RLM
) lv
ON (lv.MELDEPUNKT = zp.MELDEPUNKT)
返回相同数量的记录。将 GROUP BY 添加到子查询:
SELECT
zp.MELDEPUNKT
FROM TT_AP_MSCONS_RLM zp
LEFT OUTER JOIN (
SELECT
MELDEPUNKT
FROM TT_AP_MSCONS_RLM
GROUP BY MELDEPUNKT
) lv
ON (lv.MELDEPUNKT = zp.MELDEPUNKT)
还是返回了很多记录。但是当我像这样向子查询添加另一个字段时:
SELECT
zp.MELDEPUNKT
FROM TT_AP_MSCONS_RLM zp
LEFT OUTER JOIN (
SELECT
MELDEPUNKT,
MAX(EMAIL_VERSAND_TIMESTAMP)
FROM TT_AP_MSCONS_RLM
GROUP BY MELDEPUNKT
) lv
ON (lv.MELDEPUNKT = zp.MELDEPUNKT)
现在突然它只返回一行。在 Oracle SQL Developer 中运行最后一个查询会返回预期的大量行。
在使用 ZEOS 组件执行时和在 SQL Developer 中运行时,什么会使查询的工作方式不同?
【问题讨论】:
-
请添加再现“只有一条记录”场景的 Delphi 代码。
-
为了获得可更新的结果,一些额外的事情在幕后发生,这可能会导致某些查询出现类似的情况。尝试使用 TZReadOnlyQuery 而不是 TZQuery 来运行查询。
-
我不知道 TZReadOnlyQuery。我更改了我的代码以在任何适用的地方使用它(像往常一样,这意味着大多数地方)并且问题已经消失了。谢谢你的提示,它在很多方面都比这个特殊的奇怪案例更有意义。如果我做到了,我会尝试用一个简单的测试用例进行重现,这样也许可以得出明确的答案。但现在我很高兴。