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>

我在这里做错了什么

4

2 回答 2

3

这个问题需要更多关于检索到的结果集以及原始 50 行结果集中包含的内容的详细信息。在不知道这些细节的情况下,很难确定为什么没有过滤掉任何行。但是,考虑到您OR对所有运算符连接条件都使用了 ,那么发生的情况是只有一个条件需要满足返回所有 50 行。我将对此进行尝试,并假设罪魁祸首是日期比较,因为其余部分更具体地要求正确组合userIDisActive。我最好的“猜测”是您可能需要将ORwhere 子句中的第一个更改为 an 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>
于 2020-11-20T19:57:28.153 回答
0

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

检查您的过滤器是否按照您的预期进行。使用OR可以很容易地向您展示意想不到的结果。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 <= '2015-01-01'那样,它将继续检查userIDand isActive。对我来说,它有助于明确地阻止OR条件,以便我可以更轻松地看到我正在尝试做的事情`

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

这将使sDate您的查询成为必需的条件。

我还要指出,在约会方面,您必须注意自己的界限。您上面的查询将排除January 1, 2015 at 12:00 AM(如果sDate包括时间部分,或者如果不包括一整天)。所以你可能一直在寻找>=. 另外,请注意日期类型的精度。例如,在 SQL Server 中,adatetime仅精确到千分之一秒,因此如果事件发生在 上Dec 31, 2015 at 23:59:59.998,SQL 会认为它就像发生在 上一样Jan 1, 2015 at 00:00:00.000。尤其是日期,请注意边缘情况。

如果你想稍微缩短你的条件,你也可以使用:

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

userID IN (22,7)是的简写userID=22 OR userID=7

于 2020-11-24T12:37:58.280 回答