-1

このクエリのコメント付き(/ * * /)部分は実行されますが、クエリ全体で///////部分で問題が発生しています。これを解決するにはhlepしてください。

 SELECT *
    FROM (

 /*   (SELECT U1.EMAIL, S1.GRNNUM
       FROM RDT_USER U1,
            (SELECT O.ID, GRNNUM
               FROM RDT_ORGANIZATION O,
                    (SELECT GRNNUM, RECEPIENTCODE, ORGINATORCODE
                       FROM RDT_GOODSRECEIPTNOTE M
                      WHERE M.ACTIONSTATUS = 0
                        AND M.LATEST = 1
                        AND (SYSDATE - M.GENDATE) >= 0) S
              WHERE O.FUCODE = S.ORGINATORCODE) S1

      WHERE U1.ORGID = S1.ID)*/ A///////here am getting right paranthesis missing,

    (SELECT U.EMAIL, T1.GRNNUM
       FROM RDT_USER U,
            (SELECT O.ID, GRNNUM
               FROM RDT_ORGANIZATION O,
                    (SELECT GRNNUM, RECEPIENTCODE, ORGINATORCODE
                       FROM RDT_GOODSRECEIPTNOTE M
                      WHERE M.ACTIONSTATUS = 0
                        AND M.LATEST = 1
                        AND (SYSDATE - M.GENDATE) >= 0) T
              WHERE O.FUCODE = T.ORGINATORCODE) T1

      WHERE U.ORGID = T1.ID) B)
 WHERE A.GRNNUM = B.GRNNUM
4

2 に答える 2

1

これらの2つのサブクエリ/インラインビューは、何らかの方法で接続する必要があります。おそらく、クロス結合(それらの間のコンマで示されます)が必要です。その場合、括弧のセットを削除することもできます。

SELECT *
FROM   (SELECT U1.EMAIL, S1.GRNNUM
        FROM   RDT_USER U1,
               (SELECT O.ID, GRNNUM
                FROM   RDT_ORGANIZATION O,
                       (SELECT GRNNUM, RECEPIENTCODE, ORGINATORCODE
                        FROM   RDT_GOODSRECEIPTNOTE M
                        WHERE  M.ACTIONSTATUS = 0
                        AND    M.LATEST = 1
                        AND    (SYSDATE - M.GENDATE) >= 0) S
                WHERE  O.FUCODE = S.ORGINATORCODE) S1

        WHERE U1.ORGID = S1.ID) A,

       (SELECT U.EMAIL, T1.GRNNUM
        FROM   RDT_USER U,
               (SELECT O.ID, GRNNUM
                FROM   RDT_ORGANIZATION O,
                       (SELECT GRNNUM, RECEPIENTCODE, ORGINATORCODE
                        FROM   RDT_GOODSRECEIPTNOTE M
                        WHERE  M.ACTIONSTATUS = 0
                        AND    M.LATEST = 1
                        AND    (SYSDATE - M.GENDATE) >= 0) T
                WHERE  O.FUCODE = T.ORGINATORCODE) T1
        WHERE U.ORGID = T1.ID) B
 WHERE  A.GRNNUM = B.GRNNUM;

編集私があなたの質問を見れば見るほど、私はそれに関する問題をより多く見ます。

  1. インラインビュー/サブクエリは同じです。それらを相互結合する唯一の効果は、実行時間を増やすことです。
  2. なぜクロス結合を行っているのですか?内部結合で十分です。
  3. 内部クエリには、結合の外部クエリで参照しているいくつかの列仕様がありません。これは機能しません。

クエリの中核は基本的に次のロジックです。

select grnnum,
       recepientcode,
       originatorcode
from   rdt_goodsreceiptnote
where  actionstatus       = 0
and    latest             = 1
and    sysdate - gendate >= 0;

次に、これをと交差結合しrdt_organization、次にそれをrdt_user;と交差結合します。この混乱は、何らかの理由でそれ自体と交差します。これは、内部結合を使用して大幅に簡略化できます。

select rdt_user.email,
       rdt_goodsreceiptnote.grnnum

from   rdt_goodsreceiptnote

join   rdt_organization
on     rdt_organization.fucode = rdt_goodsreceiptnode.originatorcode

join   rdt_user
on     rdt_user.orgid = rdt_organization.id

where  rdt_goodsreceiptnode.actionstatus       = 0
and    rdt_goodsreceiptnode.latest             = 1
and    sysdate - rdt_goodsreceiptnode.gendate >= 0;

クロスジョインでこれを2回行う理由はないので、それだけです。ずっと簡単ですね

于 2013-01-21T10:01:58.117 に答える
1

A以下のようにエイリアスをコメントに入れる必要があります。

SELECT *
    FROM (

 /*   (SELECT U1.EMAIL, S1.GRNNUM
       FROM RDT_USER U1,
            (SELECT O.ID, GRNNUM
               FROM RDT_ORGANIZATION O,
                    (SELECT GRNNUM, RECEPIENTCODE, ORGINATORCODE
                       FROM RDT_GOODSRECEIPTNOTE M
                      WHERE M.ACTIONSTATUS = 0
                        AND M.LATEST = 1
                        AND (SYSDATE - M.GENDATE) >= 0) S
              WHERE O.FUCODE = S.ORGINATORCODE) S1

      WHERE U1.ORGID = S1.ID) A///////here am getting right paranthesis missing,
*/
    (SELECT U.EMAIL, T1.GRNNUM
       FROM RDT_USER U,
            (SELECT O.ID, GRNNUM
               FROM RDT_ORGANIZATION O,
                    (SELECT GRNNUM, RECEPIENTCODE, ORGINATORCODE
                       FROM RDT_GOODSRECEIPTNOTE M
                      WHERE M.ACTIONSTATUS = 0
                        AND M.LATEST = 1
                        AND (SYSDATE - M.GENDATE) >= 0) T
              WHERE O.FUCODE = T.ORGINATORCODE) T1

      WHERE U.ORGID = T1.ID) B)
 WHERE A.GRNNUM = B.GRNNUM
于 2013-01-21T09:59:20.313 に答える