gpt4 book ai didi

php - 插入相当于 "exists"

转载 作者:可可西里 更新时间:2023-11-01 00:52:12 26 4
gpt4 key购买 nike

我是 Propel 的新手,一直在阅读文档。但是,我还没有找到与 SQL 中的 EXISTS 和 NOT EXISTS 结构明确等价的东西。例如,.NET 中的 Linq 具有 Any()。在“惯用的”Propel 中是否有等同于以下内容的内容?

SELECT a.column1, a column2, a.etc
FROM TableA a
WHERE NOT EXISTS (SELECT 1
FROM TableB b
WHERE b.someIdColumn = a.someIdColumn
AND b.aNullableDateColumn IS NULL)

最佳答案

在进行更多挖掘之后,我相信我已经找到了我的问题的答案,或者至少是目前可用的最佳答案。

EXISTS 或 NOT EXISTS 之后的是子查询。虽然这个事实看起来很明显,但我最初并没有想到将我的帮助搜索集中在子查询上。我找到了一个 few resources关于这个话题。本质上,选项是使用 JOIN 重写查询(@Kaltas 的答案的核心)或使用 Criteria::CUSTOM。我决定我可能更喜欢第二个选项,因为它允许我保留子查询,可能有助于提高我的数据库性能。

然后,我阅读了大量有关 Criteria::CUSTOM 的资料,但唯一真正对我有帮助的资料是阅读 Propel 1.5 源代码。这很简单,真的。只需将子查询逐字逐句(使用数据库的表名和列名,不是 Propel 的对象名)连同 EXISTS 或 NOT EXISTS 一起放在 where 调用中,例如:

TableAQuery::create()
->where('NOT EXISTS (SELECT 1 FROM TableB WHERE TableA.someIdColumn = TableB.someIdColumn AND TableB.aNullableDateColumn IS NULL)')
->find();

就这么简单。在内部,where 方法会尝试一些解释子句的可能性,如果没有找到匹配项,它将子句视为属于 Criteria::CUSTOM 并将其插入到SQL 查询原样。因此,例如,我不能使用表别名。

如果我有时间,也许我会用更“ORM-ish”的方式来做这件事并提交一个补丁。不过,有人可能会先于我。

关于php - 插入相当于 "exists",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4858911/

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