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

Откуда:
Сообщений: 416
Добрый день.

Есть результирующий набор. В одном столбце которого иногда образовывается Null-строки. Как их исключить из результирующего набора ? Может как-то можно псевдониму столбца задать NotNull и он их будет опускать ?

SQL Server 2005
10 апр 12, 11:07    [12391952]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
Написать условие в Where не пробовали ?
10 апр 12, 11:09    [12391963]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Exproment
Member

Откуда:
Сообщений: 416
Прошу прощения, неправильно описал задачу... Сформирован результирующий набор (в теле селекта былы выполненные некоторые действи и т.д.) Только после выполнения запроса необходимо отсеч все чтос NULL. хотел узнать можно ли это сделать красиво, без вложенных запросов.
10 апр 12, 11:20    [12392043]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Exproment,

Что некрасивого во вложенных запросах?! И... чтобы ответить на Ваш вопрос можно\нельзя, нужно выполнить п.6. Рекомендации по оформлению сообщений в форуме
10 апр 12, 11:22    [12392066]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
Exproment
Только после выполнения запроса необходимо отсеч все чтос NULL

После выполнения запроса сервер уже ничего не делает
Если клиенту не нравится полученный результат, то он сам должен решать эту проблему
10 апр 12, 11:23    [12392079]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Exproment
Member

Откуда:
Сообщений: 416
select  C.ID,
		CSL.Пользователь,
		CSL.IDстатуса,		
		interval = datediff(mi,Min(case(CSL.ConsigStatusID) when 2 then CSL.Moment end) over(Partition by C.ID),
					Max(case(CSL.ConsigStatusID) when 3 then CSL.Moment end) over(Partition by C.ID))
from	Статус CSL
		join таблица C on C.ID = CSL.ConsigID
		and CSL.Moment >= @DateFrom
		and CSL.Moment < @DateTo
		and CSL.ConsigStatusID in (2,3)
		and	C.ConsigTypeID = 1 


вот сам запрос. Необходимо исключить все строки, где interval = NULL Может с торону группировки и having ?
10 апр 12, 11:24    [12392092]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Exproment
Member

Откуда:
Сообщений: 416
pkarklin, Вложенные запросы работают дольше чем один запрос =)
10 апр 12, 11:26    [12392102]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
Exproment
Необходимо исключить все строки, где interval = NULL Может с торону группировки и having ?

Что мешает написать where то ?
10 апр 12, 11:26    [12392104]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
Exproment
Вложенные запросы работают дольше чем один запрос

Да конечно
10 апр 12, 11:26    [12392108]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
TeufelDan
Member

Откуда: оттуда
Сообщений: 61
Exproment
Может с торону группировки и having ?

Думаю лучше в сторону WITH и потом обычный WHERE :)
10 апр 12, 11:27    [12392111]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Exproment
Member

Откуда:
Сообщений: 416
и что... я напишу where notNUll( datediff(mi,Min(case(CSL.ConsigStatusID) when 2 then CSL.Moment end) over(Partition by C.ID),
Max(case(CSL.ConsigStatusID) when 3 then CSL.Moment end) over(Partition by C.ID)) )
и для каждой правильной строки(коих в 100 раз больше чем неправильных) будет дважды высчитывать данное выражение ? а как-же оптимизация ?

Если больше никаких идей не найдется, сделаю через сложенный запрос. =) (ну или CTE)
10 апр 12, 11:31    [12392136]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
Exproment
и для каждой правильной строки(коих в 100 раз больше чем неправильных) будет дважды высчитывать данное выражение ? а как-же оптимизация ?

Это вы в плане выполнения увидели или просто так думаете ?
10 апр 12, 11:33    [12392147]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Exproment
Member

Откуда:
Сообщений: 416
скорость выполнения увеличилась на 3 с. (большие объемы данных)
10 апр 12, 11:37    [12392178]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
Exproment
скорость выполнения увеличилась на 3 с.

Это вы тоже все из плана выполнения и статистики выполнения получили ?
10 апр 12, 11:38    [12392186]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Exproment
Member

Откуда:
Сообщений: 416
начинается нубство с моей стороны: нет... это я взял просто из времени выполнения запроса. Средствами SQL Management Studio.
10 апр 12, 11:54    [12392291]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Glory
Member

Откуда:
Сообщений: 104751
Exproment
это я взял просто из времени выполнения запроса. Средствами SQL Management Studio.

Это типа цифирки в нижнем правом углу окна запуска ?
10 апр 12, 11:55    [12392306]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Exproment
Member

Откуда:
Сообщений: 416
ага )))))))))
10 апр 12, 12:19    [12392517]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
AxuliON
Member

Откуда: оттуда, и на лыжах
Сообщений: 574
Exproment,

а обернуть Ваш запрос в еще один select не устраивает?

select * from (ваш запрос) as t1 where t1.interval is not NULL
10 апр 12, 12:43    [12392709]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Exproment
pkarklin, Вложенные запросы работают дольше чем один запрос =)


Запрос, реализованный через derived table, в котором накладывается дополнительное условие, естественно будет работать медленнее, чем запрос без этого условия.
10 апр 12, 12:50    [12392767]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
interval is not null
Guest
Exproment

так?

select * from (

select  C.ID,
		CSL.Пользователь,
		CSL.IDстатуса,		
		interval = datediff(mi,Min(case(CSL.ConsigStatusID) when 2 then CSL.Moment end) over(Partition by C.ID),
					Max(case(CSL.ConsigStatusID) when 3 then CSL.Moment end) over(Partition by C.ID))
from	Статус CSL
		join таблица C on C.ID = CSL.ConsigID
		and CSL.Moment >= @DateFrom
		and CSL.Moment < @DateTo
		and CSL.ConsigStatusID in (2,3)
		and	C.ConsigTypeID = 1 )  qwe

where qwe.interval is not null


вот сам запрос. Необходимо исключить все строки, где interval = NULL Может с торону группировки и having ?
10 апр 12, 12:55    [12392807]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
AxuliON
Member

Откуда: оттуда, и на лыжах
Сообщений: 574
pkarklin
Exproment
pkarklin, Вложенные запросы работают дольше чем один запрос =)


Запрос, реализованный через derived table, в котором накладывается дополнительное условие, естественно будет работать медленнее, чем запрос без этого условия.


Если уж заморачиваться с оптимизацией, то тут выхода два:
1. Промежуточная таблица с результатами
2. Триггер на вставку/изменение данных, который для каждой записи будет interval пересчитывать.
10 апр 12, 12:56    [12392822]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
AxuliON
Member

Откуда: оттуда, и на лыжах
Сообщений: 574
interval is not null,

ога!
10 апр 12, 12:57    [12392833]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
interval is not null
Guest
AxuliON
interval is not null,

ога!


Обогнал))
10 апр 12, 12:59    [12392852]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
И вообще не совсем понятно, что надо посчитать. Разницу между 2 и 3 статусом?

SELECT
  CSL.ConsigID,
  CSL.UserName,
  DATEDIFF(mi, (SELECT TOP 1 Moment FROM Статус WHERE ConsigID = CSL.ConsigID AND ConsigStatusID = 2 ORDER BY Moment) , CSL.Moment)
FROM
  dbo.Статус CSL 
WHERE
  EXISTS(SELECT * FROM dbo.таблица C WHERE C.ID = CSL.ConsigID AND C.ConsigTypeID = 1)
  AND CSL.ConsigStatusID = 3
  AND CSL.Moment >= '20120401'
  AND CSL.Moment < '20120411'
10 апр 12, 13:30    [12393146]     Ответить | Цитировать Сообщить модератору
 Re: Не выводить строки с NULL  [new]
Exproment
Member

Откуда:
Сообщений: 416
В общем все списибо реализовал через подзапрос. В принципе на производительность заметно не влияет.
11 апр 12, 09:59    [12397266]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить