Hi Lukasz,

this is not a bug of MaxDB but a slight confusion about what you're asking the DB to do.

You've specified two OUTER joins and defined the table that column is LEFT from the equal sign to be the table where NULLs will be added if fitting values are missing.

In this case it may be easier to rewrite the statement into the "oracle"-notation:
  select * from "Table1"
  left join "Table2" on "Table1_ID"="Table2_IDTable1"
will be
  select * from "Table1", "Table2"
  where "Table2"."Table2_IDTable1" = "Table1"."Table1_ID"(+)

This means: get me ALL rows from Table2 and fill in NULLs if no fitting row from Table1 is found.

Likewise

  select * from "Table1"
  left join "Table2" on "Table2_IDTable1"="Table1_ID"
will be
  select * from "Table1", "Table2"
  where "Table2"."Table2_IDTable1"(+) = "Table1"."Table1_ID"

This means: get me ALL rows from Table1 and fill in NULLs if no fitting row from Table2 is found

Unfortunately you made up a testcase where both resultsets are the same, since there is always one row found and one row to be filled with NULLs. But since this testcase only includes 1 page per table the effect on performance due to the different approaches is neglectible.

If you enter some more data into one of the tables you can easily spot the difference between the two statement:

truncate table "Table2"
//
-- insert some testdata
insert into "Table2" (select rowno, NULL from tables t1, tables t2)
//
-- reinsert your testrow
update "Table2" set "Table2_IDTable1"=10 where "Table2_ID"=21

-- for joins MaxDB need statistics!
update stat "Table2"
//

Now check again:
  select * from "Table1"
  left join "Table2" on "Table2_IDTable1"="Table1_ID"

still delivers 2 rows while
  select * from "Table1"
  left join "Table2" on "Table1_ID"="Table2_IDTable1"

returns more than 270.000 rows on my (nearly empty) testdb.

So to answer your question:
Yes, of course the order of fields in the ANSI JOIN LEFT/RIGHT statement is significant. Otherwise terms like LEFT and RIGHT would simply make no sense, wouldn't they?

Best regards,
Lars

Reply via email to