您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Advanced (?) AND / OR 查询

Advanced (?) AND / OR 查询

我不得不说-我很困惑。我想不出任何解决方案,甚至会接近。我会尝试在这些方向上寻找解决方案:

啊,我想我明白了!虽然我认为演出会很惨。但这行得通!例如,如果您需要搜索1 AND 2 AND (3 OR 4)则可以编写:

SELECT
    *
FROM
    Persons A
WHERE
    EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=1)
    AND
    EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=2)
    AND
    (
        EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=3)
        OR
        EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=4)
    )

这是另一个,尽管性能可能会更差:

SELECT p.* FROM Person p
    JOIN (select PersonID from PersonCriteria WHERE CriteriaID=1) c1 ON p.PersonID=c1.PersonID
    JOIN (select PersonID from PersonCriteria WHERE CriteriaID=2) c2 ON p.PersonID=c2.PersonID
    JOIN (select PersonID from PersonCriteria WHERE CriteriaID IN (3,4)) c3 ON p.PersonID=c3.PersonID

这是2号的变体,但实际上可能会有不错的表现!

SELECT p.* FROM
    Person p
    JOIN PersonCriteria c1 on (p.PersonID=c1.PersonID AND c1.CriteriaID=1)
    JOIN PersonCriteria c2 on (p.PersonID=c2.PersonID AND c2.CriteriaID=2)
    JOIN PersonCriteria c3 on (p.PersonID=c3.PersonID AND c3.CriteriaID IN (3,4))

如果您向列(PersonID,CriteriaID)上的PersonCriteria添加一个索引(正是按此顺序!),那么我认为它无论如何都将与您获得的速度一样快。

其他 2022/1/1 18:41:36 有315人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶