首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SELECT EXISTS和EXISTS之间的差异

SELECT EXISTS和EXISTS之间的差异
EN

Stack Overflow用户
提问于 2015-06-24 22:22:36
回答 1查看 200关注 0票数 0

我有一个这样的查询

代码语言:javascript
运行
复制
    SELECT ... FROM ... WHERE (SELECT EXISTS (SELECT...))

which did not return anything then i changed it to 

    SELECT ... FROM ... WHERE (EXISTS (SELECT...))

and i got my results, can anyone explain the difference?

这里是完整的查询,更改在第40行:

代码语言:javascript
运行
复制
SELECT 
    user_element_status.user_id, 
    user_element_status.element_id, 
    notifications.id 
FROM 
    notifications 
    INNER JOIN notification_element ON  (notification_element.notification_id=notifications.id) 
    INNER JOIN user_element_status  ON  ( 
                                        user_element_status.element_id=notification_element.element_id 
                                    AND 
                                        case
                                            when notifications.notstatus=0 then notifications.notification_status LIKE CONCAT('%',user_element_status.`status`,'%')
                                            when notifications.notstatus=1 then notifications.notification_status NOT LIKE CONCAT('%',user_element_status.`status`,'%')
                                        End 
                                    AND user_element_status.`status` != 'not_required'
                                    AND 
                                        DATE_ADD(
                                        case 
                                            when notifications.notification_trigger='assigned' then user_element_status.assigned 
                                            when notifications.notification_trigger='first_launch' then user_element_status.firstlaunch 
                                            when notifications.notification_trigger='completed' then user_element_status.completedate 
                                            when notifications.notification_trigger='due' then user_element_status.duedate
                                            when notifications.notification_trigger='credited' then user_element_status.creditcompletedate
                                        End 
                                        , INTERVAL triggerdelay DAY)
                                        - CURRENT_TIMESTAMP < 0 
                                    )
    INNER JOIN users ON (users.id=user_element_status.user_id AND users.is_active=1)


WHERE 
    NOT EXISTS  ( 
                    SELECT * FROM alreadysent 
                    WHERE 
                        alreadysent.user_id=user_element_status.user_id AND 
                        alreadysent.element_id=notification_element.element_id AND 
                        alreadysent.notification_id=notification_element.notification_id
                )
    AND 
    (EXISTS (
        SELECT
            user_group.user_id,
            element_group.element_id
        FROM user_group
            user_group
            INNER JOIN users ON (users.id=user_group.user_id)
            LEFT JOIN element_group ON (element_group.group_id=user_group.group_id)
            LEFT JOIN elements ON (elements.group_id=user_group.group_id)
            LEFT JOIN element_localization ON ((element_localization.element_id=element_group.element_id OR element_localization.element_id=elements.id) AND users.country_id=element_localization.country_id)
            LEFT JOIN element_arealocalisation ON (element_arealocalisation.element_id = element_group.element_id OR element_arealocalisation.element_id=elements.id)
            LEFT JOIN area_country ON (element_arealocalisation.area_id = area_country.area_id AND area_country.country_id=users.country_id)
        WHERE 
            users.is_active=1 AND
            user_group.user_id=user_element_status.user_id AND
            (element_group.element_id=user_element_status.element_id OR elements.id=user_element_status.element_id) AND
            (element_localization.country_id IS NOT NULL OR area_country.country_id IS NOT NULL)
        ))
EN

回答 1

Stack Overflow用户

发布于 2015-06-24 22:32:45

您检查过Documentation吗;实际的语法是

代码语言:javascript
运行
复制
SELECT .. FROM .. WHERE [NOT]EXISTS (Subquery);

根据您在post中所做的编辑,您实际上正在进行以下操作,而不是您在第一个查询中显示的内容

代码语言:javascript
运行
复制
WHERE 
    NOT EXISTS  (  subquery )
    AND 
    EXISTS ( subquery )

见@siride注释,我能说的唯一的区别是在AND (EXISTS (subquery))的情况下,如果子查询返回行,那么它将被评估为AND TRUE,而在AND (SELECT EXISTS ( subquery ))的情况下,它将被评估为AND SELECT TRUE……但是在任何一种情况下,EXISTS逻辑都应该工作得很好,并且您的查询应该返回相同的预期结果集,但是根据您的帖子,您说第一个版本的AND (SELECT EXISTS ( subquery ))不会获取记录……我真的对此持怀疑态度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31029206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档