Michael,

Thanks so much for the query. As I am surmising from your email, the LEFT JOIN is the better way to go for performance. If you have any reason to think I should go with the subquery, let me know!

Thanks again,

John

On Dec 12, 2005, at 9:57 AM, Michael Stassen wrote:

Rhino wrote:
----- Original Message ----- From: "John Mistler" <[EMAIL PROTECTED]>
To: <mysql@lists.mysql.com>
Sent: Monday, December 12, 2005 12:34 AM
Subject: Select Unique?
I have two tables 'table1', 'table2' with a matching column 'column1'. How can I return all rows from table2 where the entry for table2.column1 does not match any entries in table1.column1?

SELECT * FROM table2 WHERE table2.column1 <> table1.column1

returns all the rows, rather than the unique rows in table2 ... Any ideas?

SELECT *
FROM table2
where table2.column1 not in
(select distinct column1
from table1
where column1 not null)

That should be "where column1 IS NOT NULL)".

The 'distinct' in the subquery is not strictly necessary but should help performance. The WHERE clause in the subquery is often omitted but really shouldn't be.
Rhino

If you're interested in performance, you probably shouldn't use a subquery. If you put EXPLAIN in front, you'll see that mysql labels this a "DEPENDENT SUBQUERY", meaning it will rerun the subquery for each row in the outer query. The optimizer *should* be smart enough to run the inner query once, then compare rows to that list using the index, but it isn't. As a test, I made a 25 row table and a copy missing 3 of those rows. The subquery version took twice as long to execute (.12 sec) as the left join version (.06 sec). The larger the tables involved, the larger the difference is likely to be.

Michael

(Test run on my iBook G4, OS X 10.3.9, mysql 4.1.15.)



--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to