Coldfusion 查询返回我完整返回而不是筛选返回的查询

Coldfusion 查询返回我完整返回而不是筛选返回的查询,coldfusion,qoq,Coldfusion,Qoq,我的这个查询是从原始查询派生出来的,原始查询有50条记录,qoq应该给我30行,但它给了我整整50行 我在这里做什么 这是我的查询 <cfquery name="qryResults" dbtype="query"> Select * From qryResults Where sDate> {d '2015-01-01'} OR ( userID = 22 AND isActive = 1

我的这个查询是从原始查询派生出来的,原始查询有50条记录,qoq应该给我30行,但它给了我整整50行

我在这里做什么

这是我的查询

<cfquery name="qryResults" dbtype="query">
    Select *
    From qryResults
    Where sDate> {d '2015-01-01'}
    OR (
    userID = 22
    AND isActive = 1
    )
    OR (
    userID = 8
    AND isActive = 0
    )
    OR (
    userID = 7
    AND isActive = 1
    ) 
</cfquery>

这里我做错了什么

这个问题需要更详细地了解检索到的结果集以及原始50行结果集中包含的内容。如果不知道这些细节,就很难确定为什么没有行被过滤掉。但是,考虑到所有运算符连接条件都使用OR,那么只需要满足一个条件即可返回所有50行。我将尝试一下,并假设罪魁祸首是日期比较,因为其余部分更具体地要求正确组合userID和isActive。我的最佳猜测是,您可能需要将where子句中的第一个或第二个子句更改为AND,最终结果如下所示

<cfquery name="qryResults" dbtype="query">
    Select *
    From qryResults
    Where sDate> {d '2015-01-01'}
    AND (
    userID = 22
    AND isActive = 1
    )
    OR (
    userID = 8
    AND isActive = 0
    )
    OR (
    userID = 7
    AND isActive = 1
    )
</cfquery>

这个问题需要更详细地了解检索到的结果集以及原始50行结果集中包含的内容。如果不知道这些细节,就很难确定为什么没有行被过滤掉。但是,考虑到所有运算符连接条件都使用OR,那么只需要满足一个条件即可返回所有50行。我将尝试一下,并假设罪魁祸首是日期比较,因为其余部分更具体地要求正确组合userID和isActive。我的最佳猜测是,您可能需要将where子句中的第一个或第二个子句更改为AND,最终结果如下所示

<cfquery name="qryResults" dbtype="query">
    Select *
    From qryResults
    Where sDate> {d '2015-01-01'}
    AND (
    userID = 22
    AND isActive = 1
    )
    OR (
    userID = 8
    AND isActive = 0
    )
    OR (
    userID = 7
    AND isActive = 1
    )
</cfquery>

要对前面的答案添加一点内容:

检查您的过滤器是否正在执行您期望它们执行的操作。使用或可以轻松显示意外结果。SQL基本上是按顺序读取查询的WHERE部分,尽管优化器可以更改其所需的顺序,因此上面的查询表示为您提供以下行:

1) `sDate > '2015-01-01'`
OR
2) `userID = 22 AND isActive = 1`
OR
3) `userID = 8 AND isActive = 0`
OR
4) `userID = 7 AND isActive = 1`
所以如果sDate=。另外,注意你的约会类型的精确性。例如,对于SQL Server,日期时间仅精确到千分之一秒,因此,如果事件发生在2015年12月31日23:59:59.998,则在SQL看来,它就像发生在2015年1月1日00:00:00.000。尤其是在日期方面,注意边缘情况

如果您想稍微缩短您的病情,您还可以使用:

WHERE sDate > '2015-01-01'
    AND (
        ( isActive = 0 AND userID = 8 )
        OR
        ( isActive = 1 AND userID IN (22,7) )
    )

在22,7中说userID是userID=22或userID=7的简写。

要在前面的答案中添加一点内容:

检查您的过滤器是否正在执行您期望它们执行的操作。使用或可以轻松显示意外结果。SQL基本上是按顺序读取查询的WHERE部分,尽管优化器可以更改其所需的顺序,因此上面的查询表示为您提供以下行:

1) `sDate > '2015-01-01'`
OR
2) `userID = 22 AND isActive = 1`
OR
3) `userID = 8 AND isActive = 0`
OR
4) `userID = 7 AND isActive = 1`
所以如果sDate=。另外,注意你的约会类型的精确性。例如,对于SQL Server,日期时间仅精确到千分之一秒,因此,如果事件发生在2015年12月31日23:59:59.998,则在SQL看来,它就像发生在2015年1月1日00:00:00.000。尤其是在日期方面,注意边缘情况

如果您想稍微缩短您的病情,您还可以使用:

WHERE sDate > '2015-01-01'
    AND (
        ( isActive = 0 AND userID = 8 )
        OR
        ( isActive = 1 AND userID IN (22,7) )
    )

在22,7中使用userID是userID=22或userID=7的简写形式。

能否将标记添加到代码中?是否尝试了其他name=qryResults变量?除了将其保存到与源查询相同的变量之外?我保存了,但相同results@rrk重用原始查询对象的name属性是有效的。至少在ACF中是这样的,因为我在过去成功地做到了这一点。从您认为不应该返回的某一行中发布sDate、userID和isActive值。是否可以将标记添加到代码中?是否尝试了其他名称=qryResults变量?除了将其保存到与源查询相同的变量之外?我保存了,但相同results@rrk重用原始查询对象的name属性是有效的。至少在ACF中是这样的,因为我在过去成功地做到了这一点。从您认为不应该返回的行中发布sDate、userID和isActive值。我想在这个答案中添加的一件事是,如果这不是qoq,我会像这样编写where子句,其中sDate>{d'2015-01-01'}和userID,isActive在22,1,8,0中,7,1但是,我认为qoq不支持使用多个列的IN子句。我想补充一点,如果这不是qoq,我会像这样编码where子句,其中sDate>{d'2015-01-01'}和userID,在22,1,8,0,7,1中是活动的,我认为qoq不支持使用多个列的IN子句。