Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 EXISTS или IN -ошибка в логике (ms sql 2005)  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
DECLARE @date  smalldatetime
DECLARE @beg_date  smalldatetime
DECLARE @end_date  smalldatetime

SELECT @beg_date ='20120701',  @end_date ='20120730'     
        
    DECLARE @tab_date TABLE (date smalldatetime UNIQUE)
    SET @date = dateadd(day,datediff(day,(0),@beg_date),(0)) 
    WHILE @date <= @end_date
    BEGIN
        INSERT INTO @tab_date VALUES (@date)
        SET @date = DATEADD(day, 1, @date)
    END
    
-- в таблице tab2 два поля даты   
    
-- Запрос 1  -- возвращает 12650 записей
SELECT q.date2,q.date3    
FROM dbo.tab2 q
        INNER JOIN @tab_date dt
        ON dt.date IN ( 
            dateadd(day,datediff(day,(0),q.date2),(0)) ,
            dateadd(day,datediff(day,(0),q.date3),(0))    
            )

-- Запрос 2  -- возвращает 9078
SELECT q.date2,q.date3    
FROM dbo.tab2 q       
WHERE EXISTS(SELECT 1 FROM @tab_date WHERE date = dateadd(day,datediff(day,(0),q.date2),(0))
OR date = dateadd(day,datediff(day,(0),q.date3),(0)))


Почему результат Запроса 1 отличается от Запроса 2. Просьба объяснить ошибку в логике.
Как можно оптимизировать запрос 1?
19 июл 12, 10:47    [12887042]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS или IN -ошибка в логике (ms sql 2005)  [new]
daw
Member

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

так понятней?
declare @tab2 table (id int unique, date2 datetime, date3 datetime)
insert into @tab2 values (1, '20120702', '20120703')

SELECT q.id, q.date2,q.date3, dt.date
FROM @tab2 q
         INNER JOIN @tab_date dt
         ON dt.date IN (
             dateadd(day,datediff(day,(0),q.date2),(0)) ,
             dateadd(day,datediff(day,(0),q.date3),(0))
             )

Posted via ActualForum NNTP Server 1.5

19 июл 12, 11:01    [12887116]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS или IN -ошибка в логике (ms sql 2005)  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
trew,
представьте, что @tab_date.date подходит в оба элемента IN(). сколько строк выдаст inner join для исходной строки из tab2?
19 июл 12, 11:02    [12887127]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS или IN -ошибка в логике (ms sql 2005)  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Спасибо, помогли разобраться!
19 июл 12, 11:12    [12887209]     Ответить | Цитировать Сообщить модератору
 Re: EXISTS или IN -ошибка в логике (ms sql 2005)  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Shakill
trew,
представьте, что @tab_date.date подходит в оба элемента IN(). сколько строк выдаст inner join для исходной строки из tab2?


ошибка, исправляюсь. если несколько разных @tab_date.date подходят в IN() для одной и той же строки tab2
19 июл 12, 11:25    [12887291]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить