Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Растолкуйте плиз, как работает предикат all  [new]
Blob
Member

Откуда: Украина, Харьков
Сообщений: 237
SQL server 2000 service pack 3

Раньше думал, что предикат
{ = | <> | > | < | >= | < = } all 
перед подзапросом, возвращающим один столбец, работает так:
истинно, только если условие выполняется для каждого значения, возврашённого подзапросом.

А тут вдруг заметил, что когда подзапрос не возвращает ни одной строки, результатом тоже является true:
if 1 = all
    (
        select 1
        where 1 = 0
    )
select 'true'
В чём я ошибаюсь?
30 ноя 05, 16:49    [2126989]     Ответить | Цитировать Сообщить модератору
 Re: Растолкуйте плиз, как работает предикат all  [new]
Paul Sacks
Member

Откуда:
Сообщений: 1105
Сравнивает скаляр со всеми значениями в наборе.
30 ноя 05, 17:04    [2127099]     Ответить | Цитировать Сообщить модератору
 Re: Растолкуйте плиз, как работает предикат all  [new]
Paul Sacks
Member

Откуда:
Сообщений: 1105
З.Ы. Если возвращается TRUE, то условие выполняется для всех значений набора

Или я вопрос не понял???
30 ноя 05, 17:06    [2127114]     Ответить | Цитировать Сообщить модератору
 Re: Растолкуйте плиз, как работает предикат all  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

Blob

истинно, только если условие выполняется для каждого значения, возврашённого подзапросом.

ага. то есть, среди значений, возвращаемых подзапросом нет ни одного, для которого условие бы не выполнилось. то есть, это работает
аналогично:
declare @val int
set @val = 1
if not exists (select 1 where 1 = 0 and 1 <> @val)
select 'true'
поскольку подзапрос вообще не вернул ни одного значения, то там и нет ни одного значения, для которого условие бы не выполнилось.
потому и истинно...


Posted via ActualForum NNTP Server 1.3

30 ноя 05, 17:10    [2127135]     Ответить | Цитировать Сообщить модератору
 Re: Растолкуйте плиз, как работает предикат all  [new]
г0сть
Guest
2 Paul Sacks
што тут понимать - надо скрипт запустить и все ...
30 ноя 05, 17:10    [2127138]     Ответить | Цитировать Сообщить модератору
 Re: Растолкуйте плиз, как работает предикат all  [new]
Shurgenz
Member

Откуда: Питер
Сообщений: 1938
скорее, сравнивать надо вот с этим:

if exists (select 1 where 1 = 0)
select 'true'
30 ноя 05, 17:18    [2127195]     Ответить | Цитировать Сообщить модератору
 Re: Растолкуйте плиз, как работает предикат all  [new]
Blob
Member

Откуда: Украина, Харьков
Сообщений: 237
daw

поскольку подзапрос вообще не вернул ни одного значения, то там и нет ни одного значения, для которого условие бы не выполнилось.
потому и истинно...


Posted via ActualForum NNTP Server 1.3


Какая извращённая логика. "Истинно, не в том случае, если все выполняются, а если нет ни одного, который не выполняется, включая случай, когда вообще ни одного сравнения не было"
30 ноя 05, 17:23    [2127236]     Ответить | Цитировать Сообщить модератору
 Re: Растолкуйте плиз, как работает предикат all  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

Shurgenz

скорее, сравнивать надо вот с этим:

if exists (select 1 where 1 = 0)
select 'true'


то есть scalar_expression { = | <> | != | > | >= | !> | < | <= | !< } ALL ( subquery )
должно возвращать true, если subquery вернул хоть одно значение? с чего бы это?


Posted via ActualForum NNTP Server 1.3

30 ноя 05, 17:23    [2127246]     Ответить | Цитировать Сообщить модератору
 Re: Растолкуйте плиз, как работает предикат all  [new]
MsDatabaseru
Member

Откуда: Hobby.MsDatabase.ru
Сообщений: 10938
Blob
SQL server 2000 service pack 3

Раньше думал, что предикат
{ = | <> | > | < | >= | < = } all 
перед подзапросом, возвращающим один столбец, работает так:
истинно, только если условие выполняется для каждого значения, возврашённого подзапросом.

А тут вдруг заметил, что когда подзапрос не возвращает ни одной строки, результатом тоже является true:
if 1 = all
    (
        select 1
        where 1 = 0
    )
select 'true'
В чём я ошибаюсь?


все правильно,
для каждого = нет вариантов в которых бы не выполнялось условие
если выборка пустая то недопустимых условий нет
30 ноя 05, 17:27    [2127281]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить