My tables are set up something like this:
table name: process
fields: name, id_string
table name: value_seach
fields: id_string, value
I want to construct a select statement that will display all of the process names (with it's respective id_string) that do not have an entry in value_search.
The id_string in the process table can be null, and still have a name, but those need to be excluded if possible. The id_string in value_search can never be null
How do I do this?
In general if you want rows that don't exist in another table, then LEFT JOIN the other table and WHERE ... IS NULL to a column on the second table. Also you mentioned that you don't want rows where process.id_string is NULL.
SELECT p.name, p.id_string
FROM
process p
LEFT JOIN value_search v
ON v.id_string = p.id_string
WHERE
v.id_string IS NULL
AND p.id_string IS NOT NULL
This is known as an anti-join.
I believe using Not Exists
would be your best option here.
SELECT p.name, p.id_string
FROM process p
WHERE
NOT p.id_string IS NULL AND
NOT EXISTS(
SELECT NULL
FROM value_search v
WHERE p.id_string = v.id_string)
The query you want should look something like this. Note that a JOIN will be significantly faster than a subquery in the WHERE clause.
SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
ON p.id_string = v.id_string
AND p.id_string IS NOT NULL
AND v.id_string IS NULL
An equally valid variant of the query above would be:
SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
ON p.id_string = v.id_string
WHERE
p.id_string IS NOT NULL
AND v.id_string IS NULL
SELECT
name,
id_string
FROM process
WHERE id_string IS NOT NULL AND id_string NOT IN SELECT id_string FROM value_seach