Reputation: 4505
I have 2 tables Project and ProjectList like this
Project
ProjectID
Name
ProjectListID - allow null
In ProjectList
ProjectListID
ProjName
Now what i need here, i want only those recoed from ProjectList table which ProjectListID not in Project table. I made a query but it is taking lot of time to execute.
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))
Please help me to create optimize query. I am using My SQL.
Upvotes: 3
Views: 108
Reputation: 2625
select project_list.*
from project_list left join project using (project_list_id)
where isnull(project.project_id)
This query is much faster than the solutions provided by others using subquery.
Upvotes: 0
Reputation: 31
ProjectList.ProjectListID is not allow null right?
then you should try to compare by using LEFT JOINS:
SELECT * FROM ProjectList pl LEFT JOIN Project p ON pl.ProjectListID = p.ProjectListID
WHERE pl.ProjectListID is null
Upvotes: 2
Reputation: 425261
NOT NULL
condition in your query is redundant: <> 0
implies it:
SELECT *
FROM projectslist pl
WHERE pl.ProjectsListID NOT IN
(
SELECT p.ProjectsListID
FROM project p
WHERE p.ProjectsListID <> 0
)
For this to work fast, you need to create an index on project (ProjectsListID)
.
Could you please run
EXPLAIN
SELECT *
FROM projectslist pl
WHERE pl.ProjectsListID NOT IN
(
SELECT p.ProjectsListID
FROM project p
WHERE p.ProjectsListID <> 0
)
and post its output here?
Update:
Since the column in question is nullable, it is better to rewrite the query as NOT EXISTS
:
SELECT *
FROM projectslist pl
WHERE NOT EXISTS
(
SELECT NULL
FROM project p
WHERE p.ProjectsListID = pl.ProjectsListID
AND p.ProjectsListID <> 0
)
Upvotes: 1