2017-01-12 6 views
0

サブクエリをwhere句のメインクエリに参加させることに本当に問題があります。フィールドを明示的に定義するときに働くOracle SQL - ネストされたサブクエリがメインクエリに参加していません

問合せ:

SELECT m.field1, m.field2, m.field3, m.myfield, etc etc 
(SELECT aa.daysfromprev12 FROM(
    (SELECT subsubm.myfield, MAX(subsubm.date_to)-(SELECT MAX(add_months(to_date(subsubsubm.date_from), -12)) FROM maintable subsubsubm WHERE subsubsubm.myfield= subsubm.myfield) AS daysfromprev12, 
    row_number() OVER (ORDER BY (MAX(subsubm.date_to)-(SELECT MAX(add_months(to_date(subsubsubm.date_from), -12)) FROM maintable subsubsubm WHERE subsubsubm.myfield= subsubm.myfield)) DESC) rn 
    FROM maintable subsubm 
    WHERE subsubm.myfield = '123456' 
    GROUP BY subsubm.myfield, subsubm.absence_id) aa) 
where aa.myfield = '123456' and aa.rn = 2) 
AS dayss 
FROM maintable m 
where m.myfield = '123456' 

がどのように私はあなたのSQLで同じテーブルにあまりにも多くのコールがありますが、メインクエリ= m.myfield

+1

あなたがしようとしていることを説明してください。ロジックを表現して動作させる方法はおそらくあります。 –

+2

submubm.myfield = subm.myfield'ではsubm(行7)を使用しますが、これはクエリの最後に定義します(行8)。私はそれが可能な場合は、Oracleで可能性があるかどうかわからない –

+0

@JanSršeňは、それ以外の質問にこれを何度も何度もやりました。 – Matt

答えて

1

を参照するためにsubsubm.myfield = '123456' & aa.myfield = '123456'を置き換えることができますそこに声明。あなたの質問を元に戻すことができたら、私は次のように置き換えることができると思います:

SELECT field1, 
     field2, 
     field3, 
     field4, 
     myfield, 
     MAX(CASE WHEN rn = 2 THEN days end) OVER (PARTITION BY myfield) days 
FROM (SELECT field1, 
       field2, 
       field3, 
       field4, 
       myfield, 
       daysfromprev12 AS days, 
       row_number() OVER (ORDER BY daysfromprev12 DESC) rn 
     FROM (SELECT field1, 
         field2, 
         field3, 
         field4, 
         myfield, 
         MAX(date_to) OVER (PARTITION BY myfield, absence_id) - 
         MAX(add_months(TRUNC(date_from), -2)) OVER (PARTITION BY myfield) daysfromprev12 
       FROM maintable 
       WHERE myfield = '123456')); 

N.B.使用するサンプルデータを提供していないため、未テストです。また、to_date(date_from)を私はtrunc(date_from)に変換しました。これは、date_fromがDATEデータ型であり、時間部分を取り除きたいと仮定していました。文字列の場合は、不要な暗黙の変換が行われないように、日付形式のマスクをto_date()に入力する必要があります。


ETA:あなたはこの方法で行くつもりなら、あなたはおそらく、あなたのサブクエリを分離するために、サブクエリのファクタリング(CTE別名別名共通テーブル式)を使用する場合を維持/それが簡単に読み取り/書き込みに見つけるだろう。例えば。上記のクエリは次のように書き直すことができます:

with get_initial_prev12days as (SELECT field1, 
             field2, 
             field3, 
             field4, 
             myfield, 
             MAX(date_to) OVER (PARTITION BY myfield, absence_id) - 
             MAX(add_months(TRUNC(date_from), -2)) OVER (PARTITION BY myfield) daysfromprev12 
           FROM maintable 
           WHERE myfield = '123456'), 
      interim_results as (SELECT field1, 
             field2, 
             field3, 
             field4, 
             myfield, 
             daysfromprev12 AS days, 
             row_number() OVER (ORDER BY daysfromprev12 DESC) rn 
           FROM get_initial_prev12days) 
select field1, 
     field2, 
     field3, 
     field4, 
     myfield, 
     MAX(CASE WHEN rn = 2 THEN days end) OVER (PARTITION BY myfield) days 
from interim_results; 
+0

field1 etxはサブクエリにある必要がない例です。メインクエリには約300のフィールドがあります – Matt

+0

提案されたクエリはネストされたサブクエリのセットなので、最も外側のカラムクエリでは、最も内側のサブクエリでそれらを公開し、次にすべてのレベルで公開する必要があります。外部クエリまですべての列を選択したくない場合は、サブクエリで 'select *'を使用することができます(たとえば 'select field1、...、max(...)over(...)from(select sq 。*、row_number()over ... from(mt。*、max(...)... - max(...)...メインテーブルmtから...))sq) ' – Boneist

+0

ORA-00923:FROMキーワードが期待通りに見つかりません – Matt

関連する問題