1

私は通常MSSQLを使用しており、オラクルの完全な新人です。

ORDER BYサブクエリでステートメントを使用すると、Oracleドライバの問題が発生します。

例(私の実際のステートメントははるかに複雑ですが、それが私の問題にとって重要であるとは思えません-必要に応じて投稿できます):

SELECT col1
     , col2
     , (SELECT colsub FROM subtbl WHERE idsub = tbl.id AND ROWNUM=1 ORDER BY coldate) col3
FROM tbl

このような構成を行うと、odbcドライバエラーが発生します。ORA-00907:右角かっこがありません(ドイツ語から翻訳されているため、角かっこは別の単語である可能性があります:))。

私が削除すると、ORDER BY coldateすべてが正常に機能します。理由がわからなかったのですが、どうすればいいですか?

4

3 に答える 3

2

ORDER BYはWHERE句の後に評価されるため、ROWNUMとORDER BYをこのように記述しても意味がありません。つまり、この場合は効果がありません。この質問に例が示されています。

ネストが深すぎると、サブクエリをメインクエリに結合するのが難しいため、これも少し複雑になります。

この方法ではtblとsubtblを結合できないため、以下のクエリは必ずしも機能しません。

SELECT 
  col1,
  col2,
  (
    select colsub
    from  (
      SELECT colsub 
       FROM subtbl 
       WHERE idsub = tbl.id
       order by coldate
    )
    where rownum = 1
  ) as col3
FROM tbl

したがって、以下の例に示すように、ある種の分析関数を使用する必要があります。

SELECT 
  col1,
  col2,
  (SELECT max(colsub) keep (dense_rank first order by coldate) as colsub
   FROM subtbl 
   WHERE idsub = tbl.id
   group by idsub
) col3
FROM tbl

FIRST分析関数は必要以上に複雑ですが、それで仕事は終わります。

もう1つのオプションはROW_NUMBER、問題を解決する分析関数を使用することです。

SELECT 
  col1,
  col2,
  (select colsub
   from (
     SELECT 
       idsub, 
       row_number() over (partition by idsub order by coldate) as rown,
       colsub
   FROM subtbl a 
   ) a
   WHERE a.idsub = tbl.id
   and a.rown = 1
) col3
FROM tbl
于 2012-05-24T10:52:55.003 に答える
2

あなたが間違っていることは明らかです。サブクエリでorderbyを使用しています。サブクエリでorderbyを使用しても意味がないのに、なぜそれを実行したいのでしょうか。また、常に1行を返すサブクエリでorderbyを使用しています。それも意味がありません。

クエリ結果を並べ替える場合は、最高レベルの順序を使用します。

于 2012-05-24T10:38:02.867 に答える
2

試す:

select
  col1,
  col2,
  colsub
from(
  select
    col1   ,
    col2   ,
    coldate,
    max(coldate) over (partition by st.idsub) max_coldate
  from
    tbl    t,
    subtbl st
  where
    st.idsub = t.id)
where
  coldate = max_coldate
于 2012-05-24T10:50:29.230 に答える