2014-09-02 4 views
1

Обычно мы все делаем сообщения, если есть проблемы. Это другое, где я ожидал бы ошибку, но я не получаю ее.Oracle subselect не создает ошибку?

В Oracle У меня есть следующие:

create table temp_table as 
SELECT PersonID AS OtherName 
FROM Personnel 
WHERE PersonID = '12345'; 

1. select FunnyName from temp_table; -- This produce an error as expected - good. 

2. SELECT * FROM Personnel 
WHERE PersonID in (select OtherName from temp_table); --This produces 1 record - good 

3. SELECT * FROM Personnel 
WHERE PersonID in (select FunnyName from temp_table); --This produces all records - bad 

Я ожидал бы утверждение 3 также выдаст сообщение об ошибке, как подзапрос является такой же, как выбрать в заявлении 1, что действительно дает ошибку. Конечно, это не может быть ошибкой Oracle, но я не понимаю логики.

Я использую Oracle 11.

+0

Является ли утверждение 2 верно? Или должен быть SELECT * FROM Personnel WHERE PersonID в (выберите OtherName из temp_table); –

+0

Вы правы. Мои извинения - исправит. –

+2

Можете ли вы опубликовать, что такое столбцы в Личном столе? Есть ли столбец «FunnyName» в таблице Personnel? Запрос 2 кажется неправильным, он должен быть выбран * из таблицы Personal, поскольку в temp_table отсутствует столбец PersonID. – San

ответ

1

Не могу воспроизвести. Вот SQL * Plus выход с момента, когда я пытаюсь в HR схеме:

SQL> create table temp_table 
    2 as 
    3 select employee_id as other_id 
    4 from employees 
    5 where employee_id = 100; 

Table created. 

SQL> 
SQL> select funny_id 
    2 from temp_table; 
select funny_id 
     * 
ERROR at line 1: 
ORA-00904: "FUNNY_ID": invalid identifier 


SQL> 
SQL> select employee_id 
    2 from employees 
    3 where employee_id in (select other_id from temp_table); 

EMPLOYEE_ID 
----------- 
     100 

SQL> 
SQL> select employee_id 
    2 from employees 
    3 where employee_id in (select funny_id from temp_table); 
where employee_id in (select funny_id from temp_table) 
          * 
ERROR at line 3: 
ORA-00904: "FUNNY_ID": invalid identifier 

Вы получаете то же самое, если вы попытаетесь это сделать в HR образце схемы?


Вслед за комментарий от San:

Вот пример:

SQL> select employee_id 
    2 from employees 
    3 where employee_id in (select employee_id from temp_table); 

EMPLOYEE_ID 
----------- 
     100 
     101 
     102 
     103 
..... 
     203 
     204 
     205 
     206 

107 rows selected. 

И причина такого поведения является то, что в подзапросе анализатор видит, что employee_id не столбец в temp_table, но это - столбец сотрудников.

+0

Я повторил его снова в 4-й раз, и теперь он ведет себя так, как ожидалось (и, как вы упомянули). Я не уверен, как другие 3 попытки были разными, но я предполагаю, что я пропустил что-то еще. Спасибо за помощь. –

0

Ответ: это невозможно в Oracle.

У вас есть результаты? Можете ли вы опубликовать свой результат?

Я не могу воспроизвести

CREATE TABLE Table1 
    (a number) 
; 

INSERT ALL 
    INTO Table1 (a) 
     VALUES (1) 
SELECT * FROM dual 
; 

select * from table1 where a in (select b from table1); 


ORA-00904: "B": invalid identifier : select * from table1 where a in (select b from table1) 

Посмотреть Fiddle здесь

+0

Я повторил это снова в 4-й раз, и теперь он ведет себя так, как ожидалось (и, как вы упомянули). Я не уверен, как другие 3 попытки были разными, но я предполагаю, что я пропустил что-то еще. Спасибо за помощь. –

+0

@ user1208908 Вы должны опубликовать все свои структуры таблиц. – SriniV

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