2012-04-09 5 views
0

Моя версия оракула - 10.2. Очень странно, когда скалярный подзапрос имеет агрегированную операцию. Моя таблица с именем t_test выглядела так:Скалярный подзапрос имеет общую операцию

t_id t_name 
1  1 
2  1 
3  2 
4  2 
5  3 
6  3  

строка запроса выглядела так:

select t1.t_id, 
     (select count(t_name) 
     from (select t2.t_name 
       from t_test t2 
       where t2.t_id=t1.t_id 
       group by t2.t_name)) a 
from t_test t1 

результат Этот запрос является,

t_id a 
1 3 
2 3 
3 3 
4 3 
5 3 
6 3 

, который очень странно, берут t1.t_id = 1, например,

select count(t_name) 
from (select t2.t_name 
     from t_test t2 
     where t2.t_id=1 
     group by t2.t_name) 

результат 1, каким-то образом, то Оператор «где» не работает, результат точно такой же, как и мой вопрос:

select t1.t_id, 
     (select count(t_name) 
     from (select t2.t_name 
       from t_test t2 
       group by t2.t_name)) a 
from t_test t1 

Почему?

ответ

0

Можете ли вы разместить вырезку и вставку из SQL * Plus, показывающую, какой именно запрос вы используете? Вывешенный вами запрос не является действительным - псевдоним t1 не будет действителен в подзапросе, где вы ссылаетесь на него. Это заставляет меня подозревать, что вы упрощаете проблему для публикации здесь, но вы случайно оставили что-то важное.

SQL> ed 
Wrote file afiedt.buf 

    1 with x as (
    2 select 1 id, 1 name from dual union all 
    3 select 2,1 from dual union all 
    4 select 3,2 from dual union all 
    5 select 4,2 from dual union all 
    6 select 5,3 from dual union all 
    7 select 6,3 from dual 
    8 ) 
    9 select t1.id 
10  ,(select count(b.name) 
11   from (select t2.name 
12     from x t2 
13     where t2.id = t1.id 
14     group by t2.name) b) a 
15* from x t1 
SQL>/
       where t2.id = t1.id 
           * 
ERROR at line 13: 
ORA-00904: "T1"."ID": invalid identifier 

Предположительно, это было бы гораздо более естественно написать запрос, как это (предполагая, что вы действительно хотите использовать скалярный подзапрос), где t1 будет действительным псевдоним в скалярный подзапрос.

SQL> ed 
Wrote file afiedt.buf 

    1 with x as (
    2 select 1 id, 1 name from dual union all 
    3 select 2,1 from dual union all 
    4 select 3,2 from dual union all 
    5 select 4,2 from dual union all 
    6 select 5,3 from dual union all 
    7 select 6,3 from dual 
    8 ) 
    9 select t1.id 
10  ,(select count(t2.name) 
11   from x t2 
12   where t2.id = t1.id) cnt 
13* from x t1 
SQL>/

     ID  CNT 
---------- ---------- 
     1   1 
     2   1 
     3   1 
     4   1 
     5   1 
     6   1 

6 rows selected. 
+0

0 Я не хочу использовать скалярный подзапрос, я просто нахожу интересный факт, когда в скалярном подзапросе есть «группа», и я хочу знать, почему. Странно, что эта строка запроса работала в моем оракуле. – user1021531

 Смежные вопросы

  • Нет связанных вопросов^_^