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

Откуда:
Сообщений: 85
Здравствуйте!
Непонятная ситуация,есть запрос :
SELECT distinct Fn1580.D930                                              
 FROM FN1580 (NoLock)                                              
 join FN1585 (NoLock) on FN1585.D930=FN1580.D930                                              
 join FN1812 (NoLock) on FN1812.D1596=FN1580.D1596                                              
 join FN212 (NoLock) on FN212.N1=FN1580.N1                                               
 join FN211 (NoLock) on FN212.N1=FN211.N1                                              
 join FN1194 (NoLock) on FN1580.D899=FN1194.D899 and FN1194.D897 = 3 and FN1194.N13=1          
 left join FN1206 (NoLock) on FN1585.D925=FN1206.D925             
 where (isnull(FN1580.D41,'')='' OR  (isnull(FN1580.D41,'')<>'' and  isnull(FN1580.D41,'06.06.2079') > '31.12.2008') )                                               
 except         
 SELECT DISTINCT Fn1580.D930  --328        
 FROM FG1812_1 (NoLock)            
 join FG1849 (NoLock) on FG1849.G1596_1=FG1812_1.G1596_1            
 join FN1810_1 (NoLock) on FN1810_1.N283=FG1849.N283            
 join FN1580 (NoLock) on FN1810_1.D930=FN1580.D930            
 join FN1585 (NoLock) on FN1585.D930=FN1580.D930            
 join FN1812 (NoLock) on FN1812.D1596=FN1580.D1596            
 join FN212 (NoLock) on FN212.N1=FN1580.N1            
 join FN211 (NoLock) on FN212.N1=FN211.N1            
 join FN1194 (NoLock) on FN1580.D899=FN1194.D899 and FN1194.D897 = 3            
 join FN2025_1 on FG1849.N202501=FN2025_1.N202501            
 WHERE isnull(FG1812_1.Sverka,0) in (1,2)             
 and isnull(FG1849.Sverka,0) in (1,2)             
 and FN2025_1.N2025_2 in (1,3,4)    

возвращаемое количество записей = 52318

выполняем по частям:
верчняя часть
SELECT distinct Fn1580.D930                                              
 FROM FN1580 (NoLock)                                              
 join FN1585 (NoLock) on FN1585.D930=FN1580.D930                                              
 join FN1812 (NoLock) on FN1812.D1596=FN1580.D1596                                              
 join FN212 (NoLock) on FN212.N1=FN1580.N1                                               
 join FN211 (NoLock) on FN212.N1=FN211.N1                                              
 join FN1194 (NoLock) on FN1580.D899=FN1194.D899 and FN1194.D897 = 3 and FN1194.N13=1          
 left join FN1206 (NoLock) on FN1585.D925=FN1206.D925             
 where (isnull(FN1580.D41,'')='' OR  (isnull(FN1580.D41,'')<>'' and  isnull(FN1580.D41,'06.06.2079') > '31.12.2008') ) 
возвращает кол-во записей 55490
нижняя часть :
SELECT DISTINCT Fn1580.D930  --328        
 FROM FG1812_1 (NoLock)            
 join FG1849 (NoLock) on FG1849.G1596_1=FG1812_1.G1596_1            
 join FN1810_1 (NoLock) on FN1810_1.N283=FG1849.N283            
 join FN1580 (NoLock) on FN1810_1.D930=FN1580.D930            
 join FN1585 (NoLock) on FN1585.D930=FN1580.D930            
 join FN1812 (NoLock) on FN1812.D1596=FN1580.D1596            
 join FN212 (NoLock) on FN212.N1=FN1580.N1            
 join FN211 (NoLock) on FN212.N1=FN211.N1            
 join FN1194 (NoLock) on FN1580.D899=FN1194.D899 and FN1194.D897 = 3            
 join FN2025_1 on FG1849.N202501=FN2025_1.N202501            
 WHERE isnull(FG1812_1.Sverka,0) in (1,2)             
 and isnull(FG1849.Sverka,0) in (1,2)             
 and FN2025_1.N2025_2 in (1,3,4)   


кол-во записей 3174

по идее в общем запросе должно получиться 55490-3174=52316
почему получается другая цифра?
Заранее спасибо всем ответившим!
7 мар 12, 13:40    [12209759]     Ответить | Цитировать Сообщить модератору
 Re: странность с except  [new]
daw
Member

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

> по идее в общем запросе должно получиться 55490-3174=52316

это только если все строки из второго набора есть в первом.

Posted via ActualForum NNTP Server 1.5

7 мар 12, 13:51    [12209866]     Ответить | Цитировать Сообщить модератору
 Re: странность с except  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
GeneralMotors,

и по мелочи:

  • DISTINCT не нужен, ибо EXCEPT и так реализует DISTINCT
  • записывать дату как '31.12.2008' - моветон. Надо '20081231'
  • ISNULL почти везде лишний. Кроме isnull(FN1580.D41,'')='', что можно записать так: FN1580.D41 IS NULL OR FN1580.D41=''
    WHERE FN1580.D41 IS NULL OR FN1580.D41>='2009'
    
    WHERE FG1812_1.Sverka IN(1,2) AND FG1849.Sverka IN(1,2) AND FN2025_1.N2025_2 IN(1,3,4)
    
  • 7 мар 12, 14:42    [12210376]     Ответить | Цитировать Сообщить модератору
     Re: странность с except  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47142
    iap
    GeneralMotors,

    и по мелочи:

  • DISTINCT не нужен, ибо EXCEPT и так реализует DISTINCT
  • записывать дату как '31.12.2008' - моветон. Надо '20081231'
  • ISNULL почти везде лишний. Кроме isnull(FN1580.D41,'')='', что можно записать так: FN1580.D41 IS NULL OR FN1580.D41=''
    WHERE FN1580.D41 IS NULL OR FN1580.D41>='2009'
    
    WHERE FG1812_1.Sverka IN(1,2) AND FG1849.Sverka IN(1,2) AND FN2025_1.N2025_2 IN(1,3,4)
    
  • А какого типа FN1580.D41?
    Если DATETIME, то какой смысл сравнения с пустой строкой (которое, кстати, я просто забыл)?
    А если это строка, то почему?
    7 мар 12, 14:49    [12210442]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить