Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / EXISTS или IN -ошибка в логике (ms sql 2005) / 5 сообщений из 5, страница 1 из 1
19.07.2012, 10:47
    #37884946
trew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS или IN -ошибка в логике (ms sql 2005)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
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?
...
Рейтинг: 0 / 0
19.07.2012, 11:01
    #37884969
daw
daw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS или IN -ошибка в логике (ms sql 2005)
так понятней?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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
...
Рейтинг: 0 / 0
19.07.2012, 11:02
    #37884974
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS или IN -ошибка в логике (ms sql 2005)
trew,
представьте, что @tab_date.date подходит в оба элемента IN(). сколько строк выдаст inner join для исходной строки из tab2?
...
Рейтинг: 0 / 0
19.07.2012, 11:12
    #37884993
trew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS или IN -ошибка в логике (ms sql 2005)
Спасибо, помогли разобраться!
...
Рейтинг: 0 / 0
19.07.2012, 11:25
    #37885017
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EXISTS или IN -ошибка в логике (ms sql 2005)
Shakilltrew,
представьте, что @tab_date.date подходит в оба элемента IN(). сколько строк выдаст inner join для исходной строки из tab2?

ошибка, исправляюсь. если несколько разных @tab_date.date подходят в IN() для одной и той же строки tab2
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / EXISTS или IN -ошибка в логике (ms sql 2005) / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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