What I want to do is an outer join to the table, where I exclude records from the joined table based on constant matching, but keep records from the main table. For instance:
SELECT a.id, a.other, b.baz FROM a LEFT OUTER JOIN b ON a.id = b.id AND b.bar = 'foo'
Expected results:
id other baz
- ---------- -------
1 Has foo Include
2 Has none (null)
3 Has foobar (null)
I cannot get the same results by putting it in a filter state. If I use the following:
SELECT a.id, a.other, b.baz FROM a LEFT OUTER JOIN b ON a.id = b.id WHERE (b.bar IS NULL OR b.bar = 'foo')
I get these incorrect results:
id other baz
- -------- -------
1 Has foo Include
2 Has none (null)
Where he deleted records A that match record B, where bar = 'foobar'. I don't want this, I want A to be present, but B was zero in this case.
There will be several entries in table B that should be excluded, so I don’t think I can filter this out on the Crystal side without making a lot of mistakes to avoid problems with duplicate entries from table A.
I cannot use the SQL command object, because the third-party application in which we run the reports seems to choke on the SQL command objects.
I can’t use the views, because our support contract does not allow changing the databases, and our supplier is considering adding views to the database modification.
I work with Crystal Reports XI, in particular version 11.0.0.895. In case that matters, I run the Progress 9.1E04 database using the ODBC SQL-92 driver.
Examples of tables and data used in the examples can be created as follows:
CREATE TABLE a (id INTEGER, other VARCHAR(32)); CREATE TABLE b (id INTEGER, bar VARCHAR(32), baz VARCHAR(32)); insert into A (id, other) values ('1', 'Has foo'); insert into A (id, other) values ('2', 'Has none'); insert into A (id, other) values ('3', 'Has foobar'); insert into B (id, bar, baz) values ('1', 'foo', 'Include'); insert into B (id, bar, baz) values ('1', 'foobar', 'Exclude'); insert into B (id, bar, baz) values ('1', 'another', 'Exclude'); insert into B (id, bar, baz) values ('1', 'More', 'Exclude'); insert into B (id, bar, baz) values ('3', 'foobar', 'Exclude');