SQL查询问题

时间:2010-05-25 09:36:39

标签: mysql

我有2个表Project和ProjectList就像这样

项目

ProjectID
Name
ProjectListID - allow null

在ProjectList中

ProjectListID
ProjName

现在我需要的是,我只想从ProjectList表重新编写哪些ProjectListID不在Project表中。 我提出了一个查询,但执行时间很长。

select * FROM projectslist pl where pl.ProjectsListID not in (SELECT p.ProjectsListID FROM project p where (p.ProjectsListID is not null and p.ProjectsListID <>0))

请帮我创建优化查询。我正在使用My SQL。

3 个答案:

答案 0 :(得分:2)

ProjectList.ProjectListID不允许为空吗?

然后你应该尝试使用LEFT JOINS进行比较:

SELECT * FROM ProjectList pl LEFT JOIN Project p ON pl.ProjectListID = p.ProjectListID
WHERE pl.ProjectListID is null

答案 1 :(得分:1)

查询中的

NOT NULL条件是多余的:<> 0暗示它:

SELECT  *
FROM    projectslist pl
WHERE   pl.ProjectsListID NOT IN 
        (
        SELECT  p.ProjectsListID
        FROM    project p
        WHERE   p.ProjectsListID <> 0
        )

为了使其快速起作用,您需要在project (ProjectsListID)上创建索引。

请你运行

EXPLAIN
SELECT  *
FROM    projectslist pl
WHERE   pl.ProjectsListID NOT IN 
        (
        SELECT  p.ProjectsListID
        FROM    project p
        WHERE   p.ProjectsListID <> 0
        )

并在此处发布其输出?

<强>更新

由于相关列可以为空,因此最好将查询重写为NOT EXISTS

SELECT  *
FROM    projectslist pl
WHERE   NOT EXISTS
        (
        SELECT  NULL
        FROM    project p
        WHERE   p.ProjectsListID = pl.ProjectsListID
                AND p.ProjectsListID <> 0
        )

答案 2 :(得分:0)

select project_list.*
from project_list left join project using (project_list_id)
where isnull(project.project_id)

此查询比使用子查询的其他人提供的解决方案快得多。