|
|
|
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
|
|||
|---|---|---|---|
|
#18+
Привет всем. Вычитал в STS тестах вопрос, ответ на который меня сбивает с толку. Итак, по порядку: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Я выбрал ответ В. Однако в тесте вот что сказано насчет ответа: Код: plaintext 1. 2. 3. 4. 5. 6. Попробовал на своей машине - ну никак NULL не выбирается, только все строки. Может, я чего-то не понимаю? %-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2003, 16:11 |
|
||
|
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
|
|||
|---|---|---|---|
|
#18+
Имелось в виду вот это: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2003, 16:15 |
|
||
|
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
|
|||
|---|---|---|---|
|
#18+
Мне кажется, что это не имелось в виду. Объясняю свое мнение. Я здесь подзапрос вырезал из скрипта и вопрос чуть изменил соответственно: Код: plaintext 1. 2. 3. 4. 5. Т.е. в переводе: что случится, если запрос вернет значение NULL? ИМХО, первый запрос будет выглядеть примерно так: Код: plaintext 1. 2. Согласен? А так выбираются все строки из таблы EMPLOYEE. А как вообще может получиться в подзапросе такой скрипт, как ты приводишь? Исходя из вопроса STS? Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2003, 16:35 |
|
||
|
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
|
|||
|---|---|---|---|
|
#18+
Ты путаешь понятия "не вернет ни одной строки" и "вернет 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2003, 16:52 |
|
||
|
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
|
|||
|---|---|---|---|
|
#18+
То, что поле 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2003, 16:55 |
|
||
|
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2003, 17:02 |
|
||
|
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
|
|||
|---|---|---|---|
|
#18+
Ну елки зеленые, ведь в подзапросе NULL в качестве столбца явно-то не указан?! %-) Если бы был указан, то и вопроса моего не было бы. Код: plaintext 1. 2. 3. 4. 5. 6. Откуда там вместо employee_id может взяться NULL? Это же не динамический SQL. Щас у себя reset нажму, но я в упор не понимаю Вашей интерпретации. %-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2003, 17:06 |
|
||
|
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
|
|||
|---|---|---|---|
|
#18+
Сорри, не прочел последних ответов. Спасибо огромное. :-)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2003, 17:10 |
|
||
|
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2003, 17:10 |
|
||
|
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
|
|||
|---|---|---|---|
|
#18+
В таблице EMPLOYEE есть строка (employee_id, department_id, job) : (null, 30, 'CLERK') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2003, 17:10 |
|
||
|
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
|
|||
|---|---|---|---|
|
#18+
Tam dazhe njenado znatj shto jestj strochka NULL, 30, 'CLERK' Jeslji vapros 'WHAT IF ...' to nado pomechtatj :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2003, 17:14 |
|
||
|
Вопрос по разделу PL/SQL Subqueries. Из тестов SelfTestSoftware
|
|||
|---|---|---|---|
|
#18+
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. будет преобразовано в Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Эквивалентно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Теперь рассмотрим NOT IN. Оптимизатор всегда старается избавиться от логического оператора NOT. Значит условие Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. будет заменено на следующее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Что реально будет преобразовано в Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Что на самом деле будет так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2003, 18:07 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32118523&tid=1991502]: |
0ms |
get settings: |
10ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
60ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 383ms |

| 0 / 0 |
