powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
12 сообщений из 12, страница 1 из 1
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
    #32118513
Linker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем. Вычитал в STS тестах вопрос, ответ на который меня сбивает с толку. Итак, по порядку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Question:
Evaluate this SELECT statement:

SELECT   employee_id, name
FROM      employee 
WHERE   employee_id NOT IN (SELECT  employee_id
                                                    FROM     employee 
                                                    WHERE  department_id =  30 
                                                    AND        job = 'CLERK');

What would happen if the inner query returned a NULL value?

A. No rows would be selected from the EMPLOYEE table
B. All the EMPLOYEE_ID and NAME values in the EMPLOYEE table would be displayed.
C. .....


Я выбрал ответ В. Однако в тесте вот что сказано насчет ответа:

Код: plaintext
1.
2.
3.
4.
5.
6.
Answer:
(A) No rows would be selected from the EMPLOYEE table.
The SQL statement attempts to display the employees who are not in department
  30  and who not have the job of clerk.  The statement would seem to return the
 desired results.  However, if one of the values returned by the inner query is null,
 the entire query will not return any rows.  Because all the conditions that
 compare a null value will result in null.


Попробовал на своей машине - ну никак NULL не выбирается, только все строки. Может, я чего-то не понимаю? %-)
...
Рейтинг: 0 / 0
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
    #32118523
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имелось в виду вот это:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
dan@oraspb>; select count(*) from scott.emp;

  COUNT(*)
 ----------
 
         14 

dan@oraspb>; select * from scott.emp
   2   where empno not in (
   3      select null from dual
   4   )
   5   /

no rows selected
...
Рейтинг: 0 / 0
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
    #32118538
Linker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне кажется, что это не имелось в виду. Объясняю свое мнение.
Я здесь подзапрос вырезал из скрипта и вопрос чуть изменил соответственно:
Код: plaintext
1.
2.
3.
4.
5.
SELECT  employee_id
FROM    employee 
WHERE  department_id =  30 
AND      job = 'CLERK'

What would happen if the query returned a NULL value?


Т.е. в переводе: что случится, если запрос вернет значение NULL?
ИМХО, первый запрос будет выглядеть примерно так:
Код: plaintext
1.
2.
SELECT   employee_id, name
FROM      employee 
WHERE   employee_id NOT IN NULL

Согласен?
А так выбираются все строки из таблы EMPLOYEE.

А как вообще может получиться в подзапросе такой скрипт, как ты приводишь? Исходя из вопроса STS?
Код: plaintext
1.
2.
3.
SELECT  NULL
FROM    employee 
WHERE  department_id =  30 
AND      job = 'CLERK');
...
Рейтинг: 0 / 0
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
    #32118567
Прохожий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты путаешь понятия "не вернет ни одной строки" и "вернет NULL"
Например
select * from emp where empno NOT IN (select 0 from dual where 1=2)
вернет все строки, а
select * from emp where empno NOT IN (select NULL from dual)
не вернет ни одной, потому, что получается выражение
where empno != NULL в этом случае значение этого выражения будет UNKNOWN и все, что стоит за WHERE вернет FALSE
...
Рейтинг: 0 / 0
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
    #32118575
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То, что поле EMPLOYEE.EMPLOYEE_ID допускает NULL-значения, ИМХО следует оставить на совести составителей запроса:) Здесь ужк говорили, что если подзапрос возвращает NULL в качестве одного из своих значений, то при использовании NOT IN результатом всего запроса будет пустой resultset. То, что я select null from dual написал- для простоты, а так сам попробуй:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table employee (
    employee_id number( 9 )
  , department_id number( 9 )
  , job varchar2( 32 )
)
/
insert into employee(employee_id, department_id, job) 
  values ( 1 ,  20 , 'CHIEF');
insert into employee(employee_id, department_id, job) 
  values (null,  30 , 'CLERK');
commit;

select employee_id
from employee
where employee_id not in (
  select employee_id
  from employee
  where department_id =  30 
    and job = 'CLERK'
 );
...
Рейтинг: 0 / 0
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
    #32118583
Delerium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1) No rows returned = NULL
Mozhno proveritj tak:
select dual.*, nvl((select * from dual where 1 = 2), 'Nothing') Nothing from dual

2) Otvet A vernij tolko potomu, shto NOT IN operator vsegda vozvrashchajet FALSE jeslji subselekt vozvraschajet NULL
...
Рейтинг: 0 / 0
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
    #32118590
Linker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну елки зеленые, ведь в подзапросе NULL в качестве столбца явно-то не указан?! %-)
Если бы был указан, то и вопроса моего не было бы.

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT   employee_id, name
FROM      employee 
WHERE   employee_id NOT IN 
 (SELECT  employee_id
  FROM     employee 
  WHERE  department_id =  30 
  AND        job = 'CLERK');


Откуда там вместо employee_id может взяться NULL? Это же не динамический SQL.
Щас у себя reset нажму, но я в упор не понимаю Вашей интерпретации. %-)
...
Рейтинг: 0 / 0
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
    #32118599
Linker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, не прочел последних ответов. Спасибо огромное. :-))
...
Рейтинг: 0 / 0
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
    #32118600
Delerium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jeslji v 30-tom departamente njetu nji 1 klerka, togda selekt

SELECT employee_id
FROM employee
WHERE department_id = 30
AND job = 'CLERK'

vernjot NULL
...
Рейтинг: 0 / 0
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
    #32118601
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таблице EMPLOYEE есть строка
(employee_id, department_id, job) : (null, 30, 'CLERK')
...
Рейтинг: 0 / 0
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
    #32118618
Delerium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tam dazhe njenado znatj shto jestj strochka NULL, 30, 'CLERK'
Jeslji vapros 'WHAT IF ...' to nado pomechtatj :)
...
Рейтинг: 0 / 0
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
    #32119628
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
from Прохожий:"select * from emp where empno NOT IN (select NULL from dual)
не вернет ни одной, потому, что получается выражение
where empno != NULL в этом случае значение этого выражения будет UNKNOWN и все, что стоит за WHERE вернет FALSE"

Скорее всего именно это и верно. Так как согласно документации Oracle при грамматическом разборе конструкции IN происходит тождественное преобразование с использванием OR.
То есть:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQLWKS> select
      2 > username
      3 > from
      4 > dba_users
      5 > emp
      6 > where
      7 > username in (null,'SYS')
      8 > 
USERNAME                      
 ------------------------------
 
SYS                           
Выбрана  1  строка.

будет преобразовано в
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQLWKS> select
      2 > username
      3 > from
      4 > dba_users
      5 > emp
      6 > where
      7 > username = null or username = 'SYS'
      8 > 
USERNAME                      
 ------------------------------
 
SYS                           
Выбрана  1  строка.


Эквивалентно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQLWKS> select 
      2 > username 
      3 > from 
      4 > dba_users 
      5 > emp 
      6 > where 
      7 > username IN (select null from dual union select 'SYS' from dual) 
      8 > 
      9 > 
USERNAME                      
 ------------------------------
 
SYS                           
Выбрана  1  строка.

Теперь рассмотрим NOT IN. Оптимизатор всегда старается избавиться от логического оператора NOT. Значит условие
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQLWKS> select
      2 > username
      3 > from
      4 > dba_users
      5 > emp
      6 > where
      7 > username not in (null,'SYS')
      8 > 
USERNAME                      
 ------------------------------
 
Выбрано  0  строк.

будет заменено на следующее
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQLWKS> select
      2 > username
      3 > from
      4 > dba_users
      5 > emp
      6 > where
      7 >  not(username = null or username = 'SYS')
      8 > 
USERNAME                      
 ------------------------------
 
Выбрано  0  строк.

Что реально будет преобразовано в
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQLWKS> select
      2 > username
      3 > from
      4 > dba_users
      5 > emp
      6 > where
      7 >  not username = null AND not username = 'SYS'
      8 > 
USERNAME                      
 ------------------------------
 
Выбрано  0  строк.

Что на самом деле будет так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQLWKS> select 
      2 > username 
      3 > from 
      4 > dba_users 
      5 > emp 
      6 > where 
      7 > username != null AND username != 'SYS' 
      8 > 
USERNAME                      
 ------------------------------
 
Выбрано  0  строк.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]