加入动态创建

Join to be created on the fly

enter image description here使用 Jaspersoft 和 SQL:我有一个名为 Claims 的 table,它有多个字段,例如 ClaimNo、ShippingNo、ShippingAddress、TrackingNo 和其他 5 个字段。现在用户可以上传到相同的 table 数据子集,所以只需说 ClaimNo 和 ShippingNo 。我们能够跟踪上传完成的日期以及创建上传的用户。

我现在必须创建一个 SQL 报告,前端的用户可以在其中 select 上传日期、上传数据的用户和 9 个带有是或否的过滤器 selection 和 backed 中的连接必须基于它们 select 的过滤器创建。这是为了查找他们创建的上传是否在现有 table 中有任何匹配数据。

这是我在有一个匹配字段的条件下提出的查询,所以我有条件加入他们。但我的假设错了。加入条件需要根据用户selection

创建
select   
main.ClaimNo, 
main.ShippingNo, 
main.ShippingAddress, 
main.TrackingNo
from ClaimsTable Main 
inner join 
(
select   
ClaimNo, 
ShippingNo, 
ShippingAddress, 
TrackingNo
from ClaimsTable 
where uploaddate between date1 and date2
and uploadedby ='user1' 
) Temp
on (join condition based on filters selected)

我最初假设我可以加入一个 id 字段,但显然无法完成,因为它们没有匹配的 ID。我在 Jasper 中创建了两个参数,一个是名为 ShippingNo 的前端,它有一个 yes 或 no 的下拉列表,

($P{ShippingNo}.equals("Yes") ? "AND main.ShippingNo= temp.ShippingNo"   : " ") 

如果他们 selected 是,那么它将附加到上面的查询中。但是如果没有设置连接条件,我该如何添加这些语句,因为它们总是附加有一个 AND。

所以假设数据在上传前在 Claim table 上看起来像这样:


 **ID** **ClaimNo** **ShippingNo** **ShippingAddress** **TrackingNo** **UDate** 
==================================================================================  
   1        101        s1             1501 Peters             T1        1/23/2020
   2        102        s2             5 Lombard Ave           T2        1/23/2020
   3        103        s3             23 Granville St         T3        1/23/2020
   4        104        s4             101 Park                T4        1/24/2020

And then the next day user uploads data into the same table 
 **ID** **ClaimNo** **ShippingNo** **ShippingAddress** **TrackingNo** **UDate** 
==================================================================================  
   1        101        s1             1501 Peters             T1        1/23/2020
   2        102        s2             5 Lombard Ave           T2        1/23/2020
   3        103        s3             23 Granville St         T3        1/23/2020
   4        104        s4             101 Park                T4        1/24/2020
   5                   s3                                     T3        1/25/2020
   6                   s2                                     T2        1/25/2020

现在,如果用户在前端运行报告:如果他们想通过以下任何过滤器以及日期和用户进行匹配,则可以选择 selecting。所以在我们的例子中,用户现在想看看他们最近上传的两个文件是否与任何已经存在的值相匹配(我们可以看到 Shipping No 和 Tracking No 匹配)

Claim No -> Yes or No
Shipping No -> Yes or No
Shipping Address-> Yes or no
TrackingNo -> Yes or No

他们 select 是的,没有发货和跟踪号

所以现在 sql 需要构造如下

select   
main.ClaimNo, 
main.ShippingNo, 
main.ShippingAddress, 
main.TrackingNo
from ClaimsTable Main 
inner join 
(
select   
ClaimNo, 
ShippingNo, 
ShippingAddress, 
TrackingNo
from ClaimsTable 
where uploaddate between date1 and date2
and uploadedby ='user1' 
) Temp
on (main.ShippingNo = temp.Shipping no
and main.TrackingNo= temp.TrackingNo)
    **ID** **ClaimNo** **ShippingNo** **ShippingAddress** **TrackingNo** **UDate** 
==================================================================================  
     2        102        s2             5 Lombard Ave          T2        1/23/2020
     3        103        s3             23 Granville St         T3       1/23/2020

如何让它工作?我需要编写 81 种用户过滤器组合 selection 还是有更简单的方法?任何见解都会有所帮助。

修改您的 ON 条件以将重言式作为固定谓词包括在内,然后通过将每个选定条件与它建立余数。这样就可以通过跳过该条件的 AND 来避免检查每个条件是否是第一个条件。所以

 select main.ClaimNo           "main ClaimNo"
      , main.ShippingNo        "main ShippingNo"
      , main.ShippingAddress   "main ShippingAddress"
      , main.TrackingNo        "main TrackingNo"
      , upload.ClaimNo         "upload ClaimNo"
      , upload.ShippingNo      "upload ShippingNo"
      , upload.ShippingAddress "upload ShippingAddress"
      , upload.TrackingNo      "upload TrackingNo"
   from claimstable  main
   join claimsupload upload
     on ( TRUE
        ...

对于用户选择 'YES' 的每个条件,“...”将替换为 AND。对于用户选择 'NO' 的条件,则不要更改建筑物查询。 然后附加以下内容:

        ) 
 where uploaddate between date1 and date2
   and uploadedby ='user1';

我合并成一个更标准的,虽然你的方式也应该工作,但也许除了 where 子句上的位置。同样在您当前的查询中,您实际上是将 CalimsTable 加入到自身中。仅仅因为您选择了一个并不能使它有所不同。为此,我使用了 ClaimsUpload 的名称。您将需要更正为实际 table。

假设用户为 ClaimNo 和 TrackingNO 选择了 Yes,为所有其他条件选择了 NO。结果查询将是:

 select main.ClaimNo           "main ClaimNo"
      , main.ShippingNo        "main ShippingNo"
      , main.ShippingAddress   "main ShippingAddress"
      , main.TrackingNo        "main TrackingNo"
      , upload.ClaimNo         "upload ClaimNo"
      , upload.ShippingNo      "upload ShippingNo"
      , upload.ShippingAddress "upload ShippingAddress"
      , upload.TrackingNo      "upload TrackingNo"
   from claimstable  main
   join claimsupload upload
     on ( TRUE
          AND main.claimno = upload.claimno
          AND main.trackingno = upload.trackingno
        ) 
 where uploaddate between date1 and date2
   and uploadedby ='user1';