是否可以使用 PHP+ODBC 发送包含带有内部连接的子查询的查询?
Posted
技术标签:
【中文标题】是否可以使用 PHP+ODBC 发送包含带有内部连接的子查询的查询?【英文标题】:Is it possible to send a query with PHP+ODBC which contains a subquery with an inner join? 【发布时间】:2019-08-26 17:22:23 【问题描述】:对不起,我的英语不好,我会尽可能清楚地解释我的问题。
我正在开发一个从 IBM iSeries AS/400 检索远程数据的 Web 应用程序,后端由 php+ODBC 组成。
我已经使用示例查询(SELECT * FROM tableA WHERE Condition)成功收集了数据,但现在我陷入了更复杂的查询。
我尝试了很多方法来检索我需要的数据,但我发现的唯一方法是使用一个查询来收集一个数组,我在其中存储我需要的键,然后将尽可能多的查询转换为数组中的键。
这会产生糟糕的结果,因为它需要启动太多查询,因此需要一分钟多的时间。
IBM iSeries Access ODBC 驱动程序是我发现执行连接的唯一方法。
您可以在下面找到我尝试通过 ODBC 进行转换的查询示例:
select * from
db.TableA
where
TableA.Column1='9999-12-31' and
TableA.Column2='0001' and
TableA.Column3='0' and
TableA.bcacod IN (
select TableB.Column1 from db.TableB inner join db.TableC on TableB.Column1=TableC.Column1 where
TableB.Column2='1' and
(TableB.Column3=0 or TableB.Column3>=" . date("Ymd") . ")
and TableC.Column2='COM'
and TableB.Column4='20')
order by TableA.Column3
无论我尝试在查询中改进什么,我总是遇到同样的错误:
警告:odbc_prepare():SQL 错误:[IBM][Programma di controllo ODBC di System i Access][DB2 per i5/OS]SQL0206 - Colonna o variabile globale TableA.Column1 non trovata., SQL state S0022
我检查了很多次,所有列的名称都是正确的。
我已经对这些字段进行了其他最简单的查询,并且它们可以正常工作。
我尝试过的另一件事是将查询直接执行到数据库中,它工作正常。
我的问题是:
ODBC 驱动程序是否能够执行子查询?
如果不可能,我会开始寻找其他方法来做我需要的事情。
非常感谢大家。
阿莱西奥
【问题讨论】:
错误似乎很清楚:在 TableA 中找不到 Column1。请显示table schema:DESCRIBE TABLE db.TableA
。
您说“所有列的名称都是正确的”,但 Db2 不这么认为;我更倾向于相信数据库。由于您没有发布实际查询或表定义,因此除了您之外的任何人都无法找到错误。
@mustaccio,DB2 for i (i5/OS) 有点不同。如果在 from 子句中使用模式名来限定表名,则必须在所有使用表名的地方使用模式名。否则,DB2 会报错。解决方法是按照建议使用别名。此外,如果设置了当前架构并且引用的表来自当前架构,它将起作用。
感谢@Satya,您的解决方案运行良好。将 db 的名称放在表名之前允许我从 ODBC 成功转换查询。我不明白的一件事是为什么如果我将相同的查询直接投射到数据库它可以毫无问题地工作。无论如何,真的非常感谢大家!
【参考方案1】:
要么在所有地方添加架构名称,要么在 from 子句中为表名添加别名。
例子:
select * from
db.TableA TableA
where
TableA.Column1='9999-12-31'
..
...
order by TableA.Column3
【讨论】:
以上是关于是否可以使用 PHP+ODBC 发送包含带有内部连接的子查询的查询?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 PHP7 连接到 SQL Server 2000?