【问题标题】:CFQuery where clause comparison to query resultsCFQuery where 子句与查询结果的比较
【发布时间】:2017-03-10 17:41:18
【问题描述】:

我有一个返回 7 条记录的查询:

<cfquery name="equip" datasource="#datasource#">
select equipment_id from service_ticket
where equipment_id > 0
</cfquery>

然后我获取这些结果并再次使用它们运行另一个查询:

<cfquery name="get_equipment_tally" datasource="#datasource#">
select *
from equipment_maintenance
where active = "yes" AND id <> #equip.equipment_id#
</cfquery>

但查询“get_equipment_tally”只是将“id”与 where 子句中我的查询结果“equip”中的第一条记录进行比较,即使返回了 7 条记录。

有办法解决吗?

【问题讨论】:

  • 您对is only comparing 'id' to the first record 的观察是您未指定行号时的默认行为。

标签: mysql coldfusion cfquery


【解决方案1】:
AND id NOT IN <cfqueryparam cfsqltype="cf_sql_integer" 
    value="#valueList(equip.equipment_id)#" list="true">

理想情况下,您可以将其转换为一个查询

<cfquery name="get_equipment_tally" datasource="#datasource#">
select *
from equipment_maintenance
where active = "yes" AND id NOT IN (select equipment_id  from service_ticket where equipment_id > 0)
</cfquery>

【讨论】:

  • 效果很好,谢谢!我不知道你在 where 子句中指定了这样的查询。
  • SQL 具有很大的灵活性,如有疑问,请尝试一下,看看会发生什么。
  • @BrianFleishman - FWIW,它被称为subquery。您也可以使用EXISTS 获得相同的结果。有 pros and cons to each 取决于确切的查询、索引等。 (如果进行比较,EXPLAIN 很方便)
  • 太棒了。谢谢。
【解决方案2】:

我喜欢这些答案,但在查询中看到 NOT IN 会让我抽搐。使用 LEFT OUTER JOIN... IS NULL 代替。它会快得多。

SELECT <list of cols here>
FROM equipment_maintenance em
LEFT OUTER JOIN equipment_id ei ON ei.equipment_id = em.equipment_id
WHERE em.Active = 'yes'
 AND ei.equipment_id IS NULL

类似的东西。

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多