4

我想要做的是一个表的外部连接,我根据匹配一个常量从连接表中排除记录,但是保留主表中的记录。例如:

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');
4

8 回答 8

7

Crystal 报表无法根据其链接和报表选择标准生成常用的 SQL 语句。您必须使用“命令”或构建视图。

简而言之,水晶很烂。

于 2010-01-07T22:53:19.240 回答
2

存储过程适合您吗?如果是这样,您可以通过这种方式预先选择数据集,而无需使用命令选项,并且可以像导入表一样导入存储过程。

我会建议执行并加入该存储过程,select * from b where bar= 'foo'以便对 b 表进行预过滤,因此您所要做的就是加入另一个联接字段。

希望有帮助。

于 2012-11-20T12:36:23.227 回答
0

您不能在数据库中创建适当的视图并将您的报告基于这些视图吗?我在 MSSQL 上使用 Crystal Reports,通常我只是创建视图以避免类似问题。

于 2008-10-31T22:19:15.560 回答
0

我可以看到两种解决方案:

a) 接受 B 中存在多个(不需要的)行(以及 A 中的重复值),使用 runnign 总计字段和/或公式计算总计 - 这不是简单的方法,但几乎总是可能的;
b) 将 B 移动到子报表中(您可以在其中轻松设置过滤器)并使用共享变量在主报表和子报表之间传达所需的值。

子报表是解决此类问题的强大工具,除非您需要将它们嵌套(不可能)或将报表导出到 excel(添加空行,至少在 CR 9 中)。

于 2008-11-19T20:53:15.797 回答
0

不确定您是否可以在 Crystal 中执行此操作,但加入 Select 怎么样?

SELECT a.id, x.baz
FROM a
LEFT OUTER JOIN 
 (SELECT id, baz FROM b WHERE bar = 'foo') As x ON a.id  = x.id
于 2008-10-23T20:22:41.940 回答
0

在我看来,您不想接受任何人的建议,但无论如何,这是最后一搏。我最近使用的数据库必须保持不变的解决方案如下:

  1. 设置 Tomcat 服务器,以便我可以运行一些 JSP 和 Hibernate。
  2. 获取日食的水晶报告
  3. 在水晶报表设计器中使用本地数据库上的伪造数据构建报表,符合我在理想世界中拥有数据的方式
  4. 使用 java servlet 将 List 传递给每个表别名,以便报告直接从 POJO 替换数据。POJO 当然可以通过从各种数据库表中提取内容并按照您认为合适的方式将它们混合在一起,从而完全在 java 中组合,通常可以提供一个完全扁平化的数据集,Crystal 报表非常乐意使用它。
于 2013-01-05T09:51:51.997 回答
0

添加

(Isnull({b.bar}) OR {b.bar} = "foo")

记录选择公式应该如您所愿。

** 编辑 **

其他几件事要尝试:

  • 使用不同的数据库驱动程序——本机驱动程序(避免 ODBC)可能会有不同的行为。我首先使用 WITH 语法注意到了这一点——SQL Server ODBC 驱动程序不起作用,但 SQL Server 本机驱动程序起作用了。
  • 虽然它牺牲了一些灵活性,但将查询嵌入到命令中,假设您可以让第 3 方的产品遵守。为完整性而添加。
于 2011-04-28T21:02:45.503 回答
0

您不应为表 b 添加过滤条件b.bar is null or b.bar = 'foo',但也不应直接访问表 b 中的属性。if b.bar = 'foo'您应该通过公式按条件获取所有属性。

于 2017-04-07T08:32:44.817 回答