Hi, I have a table as below.  Note that machine1 has 3 components (1-3),
while machine2 has only 1 components (1).

 


Machine

Component

Version


machine1

component1

1


machine1

component2

1


machine1

component3

1


machine2

component1

1

 

create table test(Machine, Component, Version);

insert into test values('machine1', 'component1', 1);

insert into test values('machine1', 'component2', 1);

insert into test values('machine1', 'component3', 1);

insert into test values('machine2', 'component1', 1);

 

I need to see what component versions are different on the machines.  What I
really need is a "self outer join", but since SQLite doesn't do outer joins,
I can use two left joins.  While writing the first left join, I discovered
that it is behaving like an inner join.

 

select *

from test a

   left join test b on a.component = b.component

where a.machine = 'machine1'

   and b.machine = 'machine2';

 

 

The expected behavior would be to return 3 rows: one row showing the
component versions for machine1 and machine2, and two rows showing the
component version for machine1 with null for machine2.

 

The actual behavior is that of an inner join:  I get only one row that shows
the component versions for both machines, and the other two components,
which don't exist for machine2, do not appear in the results at all.

 

I'm aware that SQLite only does left joins properly using SQL92 syntax,
which I am using.  I'm also aware that I'm using a where clause, and the
docs state that join constraints in a where clause cause a left join to
behave as an inner join.  However, my where clause does not constrain the
join expression, just the initial rows involved available to be joined.

 

I'm able to work around this by:

 

select *

from (select * from test where machine = 'machine1') a

   (select * from test where machine = 'machine2') b

on a.component = b.component;

 

But, I just wanted to point this behavior out.  Perhaps I've missed
something.  It looks like any time there is a where clause, a left join is
going to behave as an inner join.

 

Thanks,

 

~Mike

 

 

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to