简体   繁体   中英

MS Access 2007 Inner Join on Same Table

I have a table t1. It has columns [id] and [id2].

Select count(*) from t1 where id=1;

returns 31,189 records

Select count(*) from t1 where id=2;

returns 31,173 records

I want to know the records where id2 is in id=1 but not in id=2.

So, I use the following:

Select * from t1 a left join t1 b on a.id2=b.id2
Where a.id=2 And b.id=1
And b.id2 Is Null;

It returns zero records. Using an inner join to see how many records have id2 in common, I do...

Select * from t1 a inner join t1 b on a.id2=b.id2
Where a.id=2 And b.id=1;

And that returns 31,060. So where are the extra records in my first query that don't match? I am sure I must be missing something obvious.

Sample Data

id    id2
1     101
1     102
1     103
2     101
2     102

My expected results is to find the record with '103' in it. 'id2' not shared.

Thanks for any help. Jeff

You are attempting to do what is generally called an exclude join . This involves doing a LEFT JOIN between two tables, then using a WHERE clause to only select rows where the right table is null, ie there was no record to join. In this way, you select everything from the left table except what exists in the right table.

With this data, it would look something like this:

SELECT 
  t1.id, 
  t1.id2 
FROM test_table t1 
LEFT JOIN 
 (SELECT 
   id, 
   id2 
 FROM test_table 
 WHERE id = 2) t2
ON t2.id2 = t1.id2
WHERE t1.id = 1 
  AND t2.id IS NULL --This is what makes the exclude join happen

And here is a SQLFiddle demonstrating this in MySQL 5.7 with the sample data you provided.

I think maybe Access changes the left join to an inner join when you add a where clause to filter rows (I know SQL Server does this), but if you do the filtering in derived tables it should work:

select 
    a.* 
from 
    (select * from t1 where id = 1) a 
left join  
    (select * from t1 where id = 2) b 
on a.id2 = b.id2 
where b.id2 is null

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM