我有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。
答案 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)
此查询比使用子查询的其他人提供的解决方案快得多。