我想要做的是一个表的外部连接,我根据匹配一个常量从连接表中排除记录,但是保留主表中的记录。例如:
SELECT a.id, a.other, b.baz
FROM a
LEFT OUTER JOIN b
ON a.id = b.id
AND b.bar = 'foo'
预期成绩:
id 其他 baz -- ---------- -------- 1 有 foo 包括 2 没有(空) 3 有 foobar (null)
通过将其置于过滤条件中,我无法获得相同的结果。如果我使用以下内容:
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')
我得到这些不正确的结果:
id 其他 baz -- -------- -------- 1 有 foo 包括 2 没有(空)
它排除了恰好与 bar = 'foobar' 的 B 记录匹配的 A 记录。我不希望那样,我希望 A 存在,但在这种情况下 B 为空。
表 B 将有多个需要排除的记录,所以我认为我不能在 Crystal 端过滤这个而不做很多混乱以避免表 A 中重复记录的问题。
我不能使用 SQL 命令对象,因为我们从中运行报告的第三方应用程序似乎阻塞了 SQL 命令对象。
我不能使用视图,因为我们的支持合同不允许修改数据库,而且我们的供应商认为添加视图是一种数据库修改。
我正在使用 Crystal Reports XI,特别是版本 11.0.0.895。万一它有所作为,我正在使用 SQL-92 ODBC 驱动程序针对 Progress 9.1E04 数据库运行。
示例中使用的示例表和数据可以通过以下方式创建:
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');