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

Откуда:
Сообщений: 265
Подскажите пожалуйста, в таблице _Heads у меня заголовки общего грида, в таблице _Bodies содержимое смет.

Я хочу вывести все ID где нету банковских услуг, при таком раскладе что есть DISTINCT проверка ведь не нужна? в виде exists?

Правильно я понимаю?

SELECT DISTINCT H.Estimate
FROM _Heads H
INNER JOIN _Bodies B ON B.EstimateID = H.Estimate
WHERE H.[Status] > 0 AND H.Published IN (0,1,2,3,4) AND B.[Status] > 0 AND 
B.Name NOT LIKE 'Банковские услуги'
3 май 17, 20:07    [20454496]     Ответить | Цитировать Сообщить модератору
 Re: Простой пример с проверкой  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
SELECT 
    H.Estimate
FROM _Heads H
WHERE 
  H.[Status] > 0 AND H.Published IN (0,1,2,3,4) 
  and not exists (
    select
      *
    from    _Bodies B 
    where
      B.EstimateID = H.Estimate
      and B.[Status] > 0 
      and B.Name LIKE 'Банковские услуги'
  )
3 май 17, 20:14    [20454508]     Ответить | Цитировать Сообщить модератору
 Re: Простой пример с проверкой  [new]
Pabl0
Member

Откуда:
Сообщений: 265
Я попроще написал

SELECT DISTINCT cast(H.Estimate AS VARCHAR(50))+ ','
FROM _EstimateHeads H
INNER JOIN _ExpensesBodies B ON B.EstimateID = H.Estimate
WHERE H.[Status] > 0 AND H.Published IN (0,1,2,3,4) AND B.[Status] > 0 AND 
B.Name NOT LIKE 'Банковские услуги' AND B.EstimateID NOT IN (SELECT B1.EstimateID
                                                               FROM _ExpensesBodies B1 WHERE B1.Name = 'Банковские услуги')
3 май 17, 20:24    [20454535]     Ответить | Цитировать Сообщить модератору
 Re: Простой пример с проверкой  [new]
uaggster
Member

Откуда:
Сообщений: 757
Pabl0
Я попроще написал

SELECT DISTINCT cast(H.Estimate AS VARCHAR(50))+ ','
FROM _EstimateHeads H
INNER JOIN _ExpensesBodies B ON B.EstimateID = H.Estimate
WHERE H.[Status] > 0 AND H.Published IN (0,1,2,3,4) AND B.[Status] > 0 AND 
B.Name NOT LIKE 'Банковские услуги' AND B.EstimateID NOT IN (SELECT B1.EstimateID
                                                               FROM _ExpensesBodies B1 WHERE B1.Name = 'Банковские услуги')

Оно, конечно, проще, и хозяин - барин, но вот несколько вопросов:
1. В _ExpensesBodies всегда есть записи, соответствующие _EstimateHeads? Точно повисших нету? Декларативная ссылочная целостность, ограничение - доверенное, мда?
2. Посмотреть на план своего простого запроса не пробовал? Что-то мне кажется запрос Гавриленко Сергея Алексеевича как бы в разы эффективней будет.
3. B1.EstimateID вряд ли NULL бывают. Или бывают? :-)

Это так, сходу подумалось...
3 май 17, 22:35    [20454845]     Ответить | Цитировать Сообщить модератору
 Re: Простой пример с проверкой  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
Pabl0,

предложение IN может построить худший план по сравнению с exists. Кроме того, оно не допускает null значений при типовой настройке set ansi_nulls.
4 май 17, 11:09    [20455899]     Ответить | Цитировать Сообщить модератору
 Re: Простой пример с проверкой  [new]
rnk
Member

Откуда:
Сообщений: 126
Гавриленко Сергей Алексеевич
SELECT 
    H.Estimate
FROM _Heads H
WHERE 
  H.[Status] > 0 AND H.Published IN (0,1,2,3,4) 
  and not exists (
    select
      *
    from    _Bodies B 
    where
      B.EstimateID = H.Estimate
      and B.[Status] > 0 
      and B.Name LIKE 'Банковские услуги'
  )

А почему
B.Name LIKE 'Банковские услуги'
, а не
B.Name = 'Банковские услуги'
?
4 май 17, 16:24    [20457657]     Ответить | Цитировать Сообщить модератору
 Re: Простой пример с проверкой  [new]
iiyama
Member

Откуда:
Сообщений: 642
rnk,
Наверное потому-что SQL - декларативный язык
4 май 17, 16:33    [20457682]     Ответить | Цитировать Сообщить модератору
 Re: Простой пример с проверкой  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
rnk,

вопрос к автору.
Для анализа признака "банковские услуги" лучше использовать битовое поле, например, а не читать строку.
4 май 17, 17:14    [20457839]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить