[thelist] SQL command help
rudy
r937 at interlog.com
Sun Nov 12 15:20:47 CST 2000
> Hopefully the real DB gurus will only be one or two into
> their Sunday brews if what I suggested fails.
i usualyy stop countng after three (hic) when the nfl is on
;o)
chris, matt's way does work -- use an outer join and check for null
here's your original join query, using A and B as table names so that they
stand out a bit more --
select A.user_id, B.id
from A, B
where A.user_id = B.id
your question was to find the row that's missing from A
matt's suggestion was
select A.user_id
from B right join A
on A.user_id = B.id
where B.id is null
matt is definitely on the right track, he just got the tables backwards
;o)
if you want to find the row that's missing from A, you need to return the
key from B that doesn't match any row from A, in other words you have to
return the B.id field
as to whether you should say "A left join B" or "B right join A" this
depends on which table you want "all the rows" from
by definition, an outer join gets all the rows from one table, plus any
matching rows from the other table, with nulls in the columns where no
matching row was found
therefore if you are looking for rows of B that don't have matching rows of
A -- which was your original question, chris -- then you need "B left join
A"
notice that it is the left or right "direction" which "points at" the table
that you want "all the rows" from
so you can also say "A right join B" which is the same as "B left join
A" -- get it?
anyhow, there is an even better way ;o)
chris wanted *only the missing* rows, so a NOT EXISTS query is perfect
select id
from B
where
NOT EXISTS
(select 1 from A
where userid = B.id)
the nice part about the NOT EXISTS syntax is that it is easier to
understand -- what is *not * required is isolated -- whereas the full outer
join with null check is more, um, subtle as to what you are really after
also, the database optimizer can do stuff like look in an index and see a
record id and therefore *not retrieve* the actual row -- so NOT EXISTS
syntax executes better
the west coast games should be well into the first quarter, so we now
return you to your regularly scheduled beer...
rudy
More information about the thelist
mailing list