查询 return 查询完整 return 而不是过滤的查询

Query of Query returning me full return instead of filtered ones

我有这个查询来自原始查询,原始查询有 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 行。我将对此进行尝试,并假设罪魁祸首是日期比较,因为其余部分更具体地要求 userIDisActive 的正确组合。我最好的“猜测”是您可能需要将 where 子句中的第一个 OR 更改为 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>

对之前的回答补充一点:

检查您的过滤器是否按照您的预期进行。使用 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' 那么它会继续检查 userIDisActive。对我来说,它有助于显式地阻止 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 服务器,datetime 仅精确到千分之一秒,因此如果事件发生在 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) 是 shorthand 对于 userID=22 OR userID=7