I have two tables. I am trying to find rows in one table which do not exist in second table based on values in two columns. (I have simplified the tables to include the two columns only). There are no primary/foreign keys between the two tables. Seems simple enough but I am having a brain block now!
DDL:
CREATE TABLE [dbo].[Table_1](
[firstname] [nchar](10) NULL,
[lastname] [nchar](10) NULL
)
CREATE TABLE [dbo].[Table_2](
[firstname] [nchar](10) NULL,
[lastname] [nchar](10) NULL
)
-- create sample data
INSERT INTO [dbo].[Table_1]([firstname], [lastname])
SELECT N'John ', N'Doe ' UNION ALL
SELECT N'John ', N'Smith '
INSERT INTO [dbo].[Table_2]([firstname], [lastname])
SELECT N'John ', N'Doe '
--My failed attempts. I am expecting John smith to return
SELECT t.* FROM Table_1 AS t
WHERE NOT EXISTS
(SELECT t2.* FROM Table_2 AS t2
WHERE t.firstname <> t2.firstname
AND t.lastname <> t2.lastname)
SELECT * FROM Table_1 AS t
JOIN Table_2 AS t2
ON t.firstname <> t2.firstname
AND t.lastname <> t2.lastname
How to Select All Records from One Table That Do Not Exist in Another Table in SQL? We can get the records in one table that doesn't exist in another table by using NOT IN or NOT EXISTS with the subqueries including the other table in the subqueries.
select [ selecting columns] From table1 Right OUTER JOIN table2 ON(table1. SQL> select e. select [ selecting columns] From table1 Right OUTER JOIN table2 ON(table1. select column_name from table 1 full outer join table 2 on(connection); here all the data from table 1 and table 2 will get retrieved.
Deleting rows based on another table. Sometimes we need to delete rows based on another table. This table might exist in the same database or not. We can use the table lookup method or SQL join to delete these rows.
How about this:
SELECT *
FROM Table_1 AS t1
LEFT OUTER JOIN Table_2 AS t2
ON t1.firstname = t2.firstname
AND t1.lastname = t2.lastname
WHERE t2.firstname IS NULL AND t2.lastname IS NULL
In my case, I get only John Smith back.
You basically do an outer join between the tables on the common fields - those rows that are present in both cases will have values for both t1
and t2
.
Those rows only present in t1
will not have any values for the second table t2
.
I think this should work:
SELECT t.* FROM Table_1 AS t
LEFT JOIN Table_2 t2 ON (t.firstname = t2.firstname AND t.lastname = t2.lastname)
WHERE t2.firstname IS NULL AND t2.lastname IS NULL
But I'm surprised that your first try didn't work:
SELECT t.* FROM Table_1 AS t
WHERE NOT EXISTS
(SELECT t2.* FROM Table_2 AS t2
WHERE t.firstname <> t2.firstname
AND t.lastname <> t2.lastname)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With