0

次のクエリがあります。これは機能し、必要な出力を生成します。

SELECT
*
FROM
(SELECT
  ref_year, ref_no, min(sequence_number) sequence_number
FROM
  case_decisions
WHERE
  stage = 'C'
AND
  decision_code <> 'IA'
GROUP BY
  ref_year,
  ref_no
) temp

INNER JOIN /* Produce table of first decisions only */
  case_decisions cdec
ON
  temp.ref_year = cdec.ref_year
AND
  temp.ref_no = cdec.ref_no
AND
  temp.sequence_number = cdec.sequence_number;

ただし、これをサブクエリとして (次のように) 別の機能するクエリに結合しようとすると、fdec.ref_no が有効な識別子ではないというエラーが表示されます。サブクエリの書き方に問題があると思いますが、見つかりません。

LEFT OUTER JOIN
(SELECT
  *
FROM
  (
  SELECT
    ref_year, ref_no, min(sequence_number) sequence_number
  FROM
    case_decisions
  WHERE
    stage = 'C'
  AND
    decision_code <> 'IA'
  GROUP BY
    ref_year,
    ref_no
  ) temp

INNER JOIN /* Produce table of first decisions only */
  case_decisions cdec
ON
  temp.ref_year = cdec.ref_year
AND
  temp.ref_no = cdec.ref_no
AND
  temp.sequence_number = cdec.sequence_number
) fdec
ON
  resolved.ref_year = fdec.ref_year
AND
  resolved.ref_no = fdec.ref_no

以下の完全なクエリを与える:

SELECT
  resolved.*,
  fdec.decision_code initial_decision

FROM
  (SELECT
    t1.ref_year,
    t1.ref_no,
    t1.date_decision_status_achieved,
    t1.sequence_number
  FROM
    case_decisions t1
    LEFT OUTER JOIN
    case_decisions t2
  ON
    (t1.ref_year = t2.ref_year
  AND
    t1.ref_no = t2.ref_no
  AND
    t1.sequence_number < t2.sequence_number)
WHERE
  t2.ref_year IS NULL
AND
  t2.ref_no IS NULL
AND
  (t1.status = 8 OR t1.status =11)
AND
  t1.decision_code <> 'IA'
AND
  t1.date_decision_status_achieved between '01-APR-2008' and '01-JUN-2008' /* dates for testing purposes only */) resolved

LEFT OUTER JOIN
(SELECT
  *
FROM
  (SELECT
    ref_year, ref_no, min(sequence_number) sequence_number
  FROM
    case_decisions
  WHERE
    stage = 'C'
  AND
    decision_code <> 'IA'
  GROUP BY
    ref_year,
    ref_no
  ) temp

INNER JOIN /* Produce table of first decisions only */
  case_decisions cdec
ON
  temp.ref_year = cdec.ref_year
AND
  temp.ref_no = cdec.ref_no
AND
  temp.sequence_number = cdec.sequence_number) fdec
ON
  resolved.ref_year = fdec.ref_year
AND
  resolved.ref_no = fdec.ref_no
;

私は同様のSOの質問を見てきましたが、私が何をしようとしているようには見えません(何か間違ったことをしている兆候を期待しています)。ここで欠けているものについて何か提案はありますか?

4

2 に答える 2

2

問題はここにあります:

select * 
from (
    select ref_year,
        ref_no,
        min(sequence_number) sequence_number
    from case_decisions
    where stage = 'C'
        and decision_code <> 'IA'
    group by ref_year,
        ref_no
    ) temp
inner join case_decisions cdec on temp.ref_year = cdec.ref_year
    and temp.ref_no = cdec.ref_no
    and temp.sequence_number = cdec.sequence_number
) fdec on resolved.ref_year = fdec.ref_year

ref_no2回(から1回tempとから1回)を選択してcdecいるため、どの列を参照する*かがわかりません。ref_noの代わりに*、必要な列のみを参照してください。

このバージョンを試してください:

select resolved.*,
    fdec.decision_code initial_decision
from (
    select t1.ref_year,
        t1.ref_no,
        t1.date_decision_status_achieved,
        t1.sequence_number
    from case_decisions t1
    left outer join case_decisions t2 on (
            t1.ref_year = t2.ref_year
            and t1.ref_no = t2.ref_no
            and t1.sequence_number < t2.sequence_number
        )
    where t2.ref_year is null
        and t2.ref_no is null
        and (
            t1.status = 8
            or t1.status = 11
        )
        and t1.decision_code <> 'IA'
        and t1.date_decision_status_achieved between '01-APR-2008' and '01-JUN-2008' /* dates for testing purposes only */
) resolved
left outer join (
    select temp.ref_year, temp.ref_no, cdec.decision_code
    from (
        select ref_year,
            ref_no,
            min(sequence_number) sequence_number
        from case_decisions
        where stage = 'C'
            and decision_code <> 'IA'
        group by ref_year,
            ref_no
    ) temp
    inner join case_decisions cdec on temp.ref_year = cdec.ref_year
        and temp.ref_no = cdec.ref_no
        and temp.sequence_number = cdec.sequence_number
) fdec on resolved.ref_year = fdec.ref_year
    and resolved.ref_no = fdec.ref_no;
于 2012-07-12T13:34:58.973 に答える
1

temp と cdec の両方に列があるため、"*" によって "ref_no" という名前の 2 つの列がサブクエリに取り込まれると推測できます。

選択を次のように変更してみてください。

select cdec.*, temp.sequence_number

以前に他のデータベースでこのエラーを見たことがありますが、メッセージはより明確です。

于 2012-07-12T13:39:47.337 に答える