2017-07-21 38 views
0
SELECT c.serno, 
     NVL (
      (SELECT t1.newvalue 
      FROM ( SELECT newvalue 
         FROM applog 
         WHERE  TABNAME = 'cextension' 
          AND rowserno = c.serno -- ERROR 
          AND colname = 'A11103' 
        ORDER BY datetimestamp DESC) t1 
      WHERE ROWNUM = 1), 
      (SELECT t2.newvalue 
      FROM ( SELECT newvalue 
         FROM archapplog 
         WHERE  TABNAME = 'cextension' 
          AND rowserno = c.serno -- ERROR 
          AND colname = 'A11103' 
        ORDER BY datetimestamp DESC) t2 
      WHERE ROWNUM = 1)) AS "JoinCreditShieldProgram" 
    FROM caccounts c 

こんにちは!私はOracle DBを使用してこのクエリを実行しようとしていますが、サブクエリの "c.serno"にIDエラーが表示されます。このエラーを解決するのを手伝ってください。ありがとう。メイン選択クエリからサブクエリに値を渡す方法

+0

最初の問題は、クエリに古い結合構文を使用していることです。あなたは関係を理解する必要があり、クエリはかなり複雑です。 –

+0

これはoracleデータベースに関連付けられていますが、sql-serverタグがあることを示しています。これは正しいとは思わない。また、スローされるエラーを明確にすることはできますか? –

+0

MS SQL ServerまたはOracleを使用していますか?関与していない製品にはタグを付けないでください。 – jarlh

答えて

0

図のように、純粋なサブクエリの代わりに左外部ジョインを使用する必要があります。おそらく、(パフォーマンスをテストする必要があると思いますが)読んで理解することが容易になる

SELECT c.serno, NVL(t1.newvalue,t2.newvalue) AS "JoinCreditShieldProgram" FROM 
caccounts c LEFT OUTER JOIN 
     (SELECT newvalue,rowserno 
     FROM ( SELECT newvalue,rowserno 
        FROM applog 
        WHERE  TABNAME = 'cextension' 
         AND colname = 'A11103' 
       ORDER BY datetimestamp DESC) 
     WHERE ROWNUM = 1) t1 ON t1.rowserno = c.serno 
     LEFT OUTER JOIN 
     (SELECT newvalue,rowserno 
     FROM ( SELECT newvalue,rowserno 
        FROM archapplog 
        WHERE  TABNAME = 'cextension' 
         AND colname = 'A11103' 
       ORDER BY datetimestamp DESC) 
     WHERE ROWNUM = 1) t2 ON t2.rowserno = c.serno; 
-1
I am not sure why you are using inline view in your query statement. 
It is not required you can directly put "rownum" limit and even in more simple way, like below- 

SELECT * 
FROM (SELECT c.serno, 
       Nvl (a.newvalue, b.newvalue) AS "JoinCreditShieldProgram" 
     FROM caccounts c 
       LEFT OUTER JOIN applog a 
          ON c.serno = a.rowserno 
       LEFT OUTER JOIN archapplog b 
          ON c.serno = b.rowserno 
     WHERE a.tabname = 'cextension' 
       AND a.colname = 'A11103' 
       AND b.tabname = 'cextension' 
       AND b.colname = 'A11103' 
     ORDER BY a.datetimestamp DESC, 
        b.datetimestamp DESC) 
WHERE rownum = 1; 
+0

これは、applogとarchapplogに値を持たないcaccountの行を除外します。内側の結合ではなく、左側の外側の結合が必要です。また、OPはすべての行ではなく、applogとarchapplogから最新の行を探しています。 – Boneist

+0

私は質問を単純化する考えを示していました。はい、正確な結果のためにいくつかの変更が必要でしたので、私はクエリを更新しました。それが必要とされている正確に動作することを願っています。 – Himanshujaggi

+0

それはまだ内部結合をしている、私は恐れている。 ANSI結合構文を使用していた場合は、この問題を回避できました。 (述語のaとbの列に(+)がないことは、効果的に内部結合を行っていることを意味します) – Boneist

0

クエリは次のとおりです。

SELECT c.serno, 
    NVL(t1.newvalue, t2.newvalue) AS "JoinCreditShieldProgram" 
FROM caccounts c 
     LEFT OUTER JOIN (SELECT rowserno, 
           newvalue, 
           row_number() OVER (PARTITION BY rowserno ORDER BY datetimestamp DESC) rn 
         FROM applog 
         WHERE tabname = 'cextension' 
         AND colname = 'A11103') t1 ON c.serno = t1.rowserno AND t1.rn = 1 
     LEFT OUTER JOIN (SELECT rowserno, 
           newvalue, 
           row_number() OVER (PARTITION BY rowserno ORDER BY datetimestamp DESC) rn 
         FROM archapplog 
         WHERE tabname = 'cextension' 
         AND colname = 'A11103') t2 ON c.serno = t2.rowserno AND t2.rn = 1; 
0

Personnaly、私は最後の値を取得する必要がある場合2つのテーブルからNVLを実行する必要がある場合は、LAST_VALUE分析関数を使用することをお勧めします。

SELECT DISTINCT 
    c.serno, 
    LAST_VALUE(logs.newvalue) over 
    (partition by logs.rowserno order by logs.datetimestamp 
     ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS "JoinCreditShieldProgram" 
FROM 
    caccounts c 
LEFT JOIN 
    (
    SELECT rowserno, newvalue, datetimestamp 
    FROM applog 
    WHERE tabname = 'cextension' AND colname = 'A11103' 
    UNION 
    SELECT rowserno, newvalue, datetimestamp 
    FROM archapplog 
    WHERE tabname = 'cextension' AND colname = 'A11103' 
) logs 
ON 
    c.serno = logs.rowserno; 
関連する問題