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

Откуда:
Сообщений: 1
Помогите, пожалуйста, чайнику.

Есть 2 отношения:

R и S

a1 a2 b1 b2

A 1 1 h
A 2 2 g
B 1 3 h
B 3 9 C
B 4 9 C
C 1 1 A
C 9

запрос:

SELECT R.a1, R.a2
FROM R
WHERE R.a2 IN
    (Select b1 from S
     where S.b2=R.a1)


Сначала, как я понимаю, происходит фильтрация строк отношения S в соответствии с условием S.b2=R.a1, остаются ((9, С),(9, С),(1, A)). Далее реализуется операция проекции, получаем ((9), (9), (1)). Потом - фильтрация строк отношения R, a1, т.е., а2 д.б. либо 1, либо 9. В итоге получается ((A, 1)(B, 1)(C, 1)(C, 9)).

Однако, при выполнении сего запроса в среде Microsoft SQL SERVER MANAGEMENT STUDIO результат - ((A, 1) (C, 9)). Где ошибка в рассуждениях?
12 мар 13, 01:17    [14037907]     Ответить | Цитировать Сообщить модератору
 Re: где ошибка в рассуждениях?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
В плане такой предикат: @s.[b2] as [S].[b2]=@r.[a1] as [R].[a1] AND @r.[a2] as [R].[a2]=@s.[b1] as [S].[b1]

declare @r table (
    a1      char
    , a2    int
)

declare @s table (
    b1      int
    , b2    char
)

insert @r ( a1, a2 )
          select 'A',  1
union all select 'A',  2 
union all select 'B',  1 
union all select 'B',  3
union all select 'B',  4 
union all select 'C',  1
union all select 'C',  9

insert @s ( b1, b2 )
          select 1, 'h'
union all select 2, 'g' 
union all select 3, 'h' 
union all select 9, 'C'
union all select 9, 'C' 
union all select 1, 'A'

SELECT R.a1, R.a2
FROM @r R
WHERE R.a2 IN
    (Select b1 from @s S
     where S.b2=R.a1)
12 мар 13, 01:59    [14037955]     Ответить | Цитировать Сообщить модератору
 Re: где ошибка в рассуждениях?  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Дополню: ожидаемый результат получится в случае
SELECT R.a1, R.a2
FROM R
WHERE R.a2 IN
    (Select b1 from S
     where S.b2 IN
        (select a1 from R))
12 мар 13, 09:00    [14038220]     Ответить | Цитировать Сообщить модератору
 Re: где ошибка в рассуждениях?  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Возможно, вас заинтересует Оптимизатор (ч.1): Введение, Optimization: Simplification
12 мар 13, 11:42    [14039150]     Ответить | Цитировать Сообщить модератору
 Re: где ошибка в рассуждениях?  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Blondinka44
Сначала, как я понимаю, происходит фильтрация строк отношения S в соответствии с условием S.b2=R.a1, остаются ((9, С),(9, С),(1, A)). Далее реализуется операция проекции, получаем ((9), (9), (1)). Потом - фильтрация строк отношения R, a1, т.е., а2 д.б. либо 1, либо 9. В итоге получается ((A, 1)(B, 1)(C, 1)(C, 9)).

Однако, при выполнении сего запроса в среде Microsoft SQL SERVER MANAGEMENT STUDIO результат - ((A, 1) (C, 9)). Где ошибка в рассуждениях?


Ошибка в рассуждениях в том, что подзапрос из таблицы S - коррелированный, он вычисляется заново для каждой строки таблицы R
12 мар 13, 11:58    [14039262]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить