2012-07-12 146 views
0

我有以下查询,它工作并产生我需要它的输出。为什么工作的SQL查询不能用作子查询?

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问题,但没有似乎想要我什么(我期望的指示,我做错了什么)。对于我在这里失踪的任何建议?

+0

请发布完整的查询给出问题。 – RedFilter 2012-07-12 13:38:55

+0

对此有一个downvote,有人可以告诉我为什么这样我可以避免重复错误?谢谢。 – 2012-07-12 13:50:36

+0

在最后一个查询中,您有“SELECT resolved。*,fdec.decision_code initial_decision”。 initial_decision应该是什么?我假设它不是列名,因为我没有在其他地方看到它,并且之前没有逗号。从来没有使用甲骨文,我从来没有见过这么好奇之前,它意味着什么/用于。 – Bryan 2012-07-12 14:06:18

回答

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_no两次(一次从temp,一旦因为*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; 
+0

现在完整查询,谢谢。 SQL开发人员建议所有括号都匹配。 – 2012-07-12 13:44:17

+0

完美,谢谢。 – 2012-07-12 14:16:27

1

我最好的猜测是,“*”在名为“ref_no”成子查询两列带来的,因为温度和CDEC都有列。

尝试改变选择:

select cdec.*, temp.sequence_number 

我以前见过这个错误在其他数据库,但该消息表现得更加明显。