2016-06-23 21 views
0

JasperreportのSQLクエリに問題があります。 クエリはこれです:SQLクエリは開発者では動作しますが、JasperSoft Studioでは動作しません

select distinct 
    t.costcenter, 
    t.workplace, 
    t.sap_master_key, 
    t.product_family, 
    mb.max_module_name 
from 
    timings t, 
    max_bbz_per_timing mb 
where (
     ($P{Kostenstelle} is not null and 
     $P{APS} is not null 
     and t.timing_id in (
      select 
      timing_id 
      from 
      timings 
      where costcenter = $P{Kostenstelle} 
      and workplace = $P{APS} 
     ) 
     ) 
     or 
     ($P{Kostenstelle} is not null 
     and $P{APS} is null 
     and t.timing_id in (
      select 
      timing_id 
      from 
      timings 
      where costcenter = $P{Kostenstelle} 
     ) 
     ) 
     or 
     ($P{Kostenstelle} is null 
     and $P{APS} is not null 
     and t.timing_id in (
      select 
      timing_id 
      from 
      timings 
      where workplace = $P{APS} 
     ) 
     ) 
    ) 
and mb.timing_id =t.timing_id 
and mb.max_module_name is not null 

$P{Kostenstelle}$P{APS}はパラメータです。それらは両方ともヌルでも、それらのうちの1つだけでもありません。私の開発環境でこのSQLクエリを試してみると、それは何をすべきかをしますが、JasperSoft Studioでは$P{Kostenstelle} is not null and $P{APS} is nullが実行されたときにのみ実行されます。

あなたの誰かが私を助けてくれることを願っています。私は無知です。

+0

それらのパラメータにどのような値でしょうか? – tobi6

+0

さらに、LEFT JOINとON句を3つのチェックブロックを使用せずに使用することはできませんか? – tobi6

+0

@ tobi6あなたの答えをありがとう、しかしY.B.の答え。私のために働いた – TheOneThing

答えて

1

この巨大なSQLスクリプトは、まさにそれと同等です:timing_idがユニークである

select distinct 
    t.costcenter, 
    t.workplace, 
    t.sap_master_key, 
    t.product_family, 
    mb.max_module_name 
from timings t 
inner join max_bbz_per_timing mb 
    on mb.timing_id = t.timing_id and mb.max_module_name is not null 
inner join timings t_t 
    on t_t.timing_id = t.timing_id 
    and ($P{Kostenstelle} is not null or $P{APS} is not null) 
    and ($P{Kostenstelle} is null or t_t.costcenter = $P{Kostenstelle}) 
    and ($P{APS}   is null or t_t.workplace = $P{APS}) 

場合、クエリをさらに簡単ですることができます

select distinct 
    t.costcenter, 
    t.workplace, 
    t.sap_master_key, 
    t.product_family, 
    mb.max_module_name 
from timings t 
inner join max_bbz_per_timing mb 
    on mb.timing_id = t.timing_id and mb.max_module_name is not null 
where ($P{Kostenstelle} is not null or $P{APS} is not null) 
    and ($P{Kostenstelle} is null or t.costcenter = $P{Kostenstelle}) 
    and ($P{APS}   is null or t.workplace = $P{APS}) 
+2

私はそれを試して、今はそれが動作します。私は 'JOINS'についてもっと読むべきです。ありがとうございます – TheOneThing

+0

全くありません。この 't_t'フィルタについてはわかりません。私はそれを元のクエリの正確な振る舞いを再現するように書きました。 (私が思う) 'timing_id'がユニークであれば、クエリはもっと​​簡単です:最後の' inner join ... on ... 'を 'where'節でパラメータに' t'をフィルタリングするだけで置き換えてください。 –

関連する問題