我已经在Oracle中编写了一些基本的SQL,它们按预期运行。它选择客户、他们的ID以及他们可以提供的“服务”。
然而,当我添加从VBA代码传递的变量时,会出现错误消息ORA-00907: Missing Right Parenthesis
。这是由于代码中的一个OR
引起的。
AND C.CURRENCY LIKE :cmbSelectAccountCcy
AND (S.SERVICEID LIKE :cmbSelectServiceType OR S.SERVICEID LIKE :cmbSelectServiceType2)
AND .... etc
如果我去掉OR,它将按预期执行。OR是一个检查的一部分,包括(在结尾处)。
HAVING COUNT(S.SERVICEID) > 2
允许检查2个值,仅当这2个(或更多)值存在时才显示客户端。
Excel中的组合框将服务ID作为下拉框中的固定值或%
字符传递。我假设在某些情况下永远不会到达右括号。
为什么我可以使用硬编码值运行SQL查询,但无法通过VBA传递完全相同的变量?我在VBA中有一个Debug.Print()
语句,显示我期望看到的所有值都被传递了。
更新:
将名称cmbSelectServiceType2
更改为cmbServiceTypeTwo
似乎已经解决了问题,但是目前我还不能弄清楚原因。仍然欢迎任何答案!我能看到唯一的因素是第一个名称为21个字符,第二个名称为<20个字符。表中的列数据类型为VARCHAR2。
离题:OR语句现在返回Service1或Service1和Service2或Service2,即完全的OR语句。上面的HAVING子句是为了强制执行仅允许BOTH。
更新2
将cmbSelectServiceType2中的'2'更改为字母'two'不起作用。似乎20个字符是某种任意限制。
HAVING COUNT(S.SERVICEID) > 2
。这是什么意思? - David FaberHAVING COUNT(DISTINCT S.SERVICEID) > 2
吗? - Alex PooleHAVING COUNT(S.SERVICE_ID) >= 2
只会返回拥有多个服务ID的客户,即用户正在搜索的客户。现在我意识到我完全错了。我将其转移到VBA上,因为它与任何其他地方一样方便。 - RossC