Включить данные в набор результатов, не удовлетворяющий условию фильтра, без использования временных таблиц - PullRequest
0 голосов
/ 08 марта 2011

Пожалуйста, используйте следующие примеры данных.

declare @tbl table (id int, fid int, arrival datetime, created datetime)
insert into @tbl select 1, 10, DATEADD(dd, -10, GETDATE()), DATEADD(dd, -6, getdate())
insert into @tbl select 1, 10, DATEADD(dd, -10, GETDATE()), DATEADD(dd, -6, getdate())
insert into @tbl select 1, 10, DATEADD(dd, -10, GETDATE()), null
insert into @tbl select 2, 20, DATEADD(dd, -3, GETDATE()), DATEADD(dd, -2, getdate())
insert into @tbl select 2, 20, DATEADD(dd, -3, GETDATE()), null

Я хотел бы иметь все строки between arrival '2011-02-25' and '2011-02-28', созданные после этой даты '2011-02-20', включая дату создания null.

Query1:

select * from @tbl 
where arrival >= '2011-02-25' and arrival < '2011-02-28'
and created >= '2011-02-20'

Выше запроса извлекают две строки, но мне нужна 3-я строка FID = 10, которая создала дату null

Qery2: выберите строку FID = 20, которую я надеваюне нужно, потому что он не находится в диапазоне даты прибытия.

select * from @tbl 
where arrival >= '2011-02-25' and arrival < '2011-02-28'
and created >= '2011-02-20' OR created is null

Это примерные данные.Исходный запрос извлекает данные из другой таблицы и содержит объединения с более 10 таблицами, поэтому я не хочу повторять запрос, чтобы включить строки во временную таблицу.

Спасибо.

РЕДАКТИРОВАТЬ: Извините, хотел спросить это, но поставил неправильный вопрос.Спасибо за вашу помощь.

declare @tbl table (id int, fid int, arrival datetime, created datetime)
insert into @tbl select 1, 10, DATEADD(dd, -10, GETDATE()), DATEADD(dd, -6, getdate())
insert into @tbl select 1, 10, DATEADD(dd, -10, GETDATE()), DATEADD(dd, -6, getdate())
insert into @tbl select 1, 10, null, DATEADD(dd, -6, getdate())
insert into @tbl select 2, 20, DATEADD(dd, -3, GETDATE()), DATEADD(dd, -2, getdate())
insert into @tbl select 2, 20, null, DATEADD(dd, -2, getdate())

select * from @tbl
where arrival >= '2011-02-26' and arrival < '2011-02-28'

Нужен также третий ряд fid = 10, где arrival дата NULL

Ответы [ 3 ]

3 голосов
/ 08 марта 2011

Это может делать то, что вы хотите.

;with cte as
(
  select distinct fid
  from @tbl
  where
    arrival >= '2011-02-26' and
    arrival < '2011-02-28'
)
select *
from cte as C
  inner join @tbl as T
    on C.fid = T.fid
where
  (arrival >= '2011-02-26' and
   arrival < '2011-02-28') or
  arrival is null
1 голос
/ 08 марта 2011

Я думаю, должно работать:

select * from @tbl 
where (arrival >= '2011-02-25' and arrival < '2011-02-28')
and (created >= '2011-02-20' or created is Null)

В соответствии с вашими правками вам необходимо сделать следующее:

select * from @tbl 
where ((arrival >= '2011-02-25' and arrival < '2011-02-28') or arrival is null)
and (created >= '2011-02-20' or created is Null)

Это вернет 3-ю строку FID = 10, однако также вернет ID строки = 2 и FID = 20, поскольку эта строка также удовлетворяет условиям фильтра.

0 голосов
/ 08 марта 2011

Это немного отличается от более очевидных ответов, опубликованных выше

select * from @tbl where arrival >= '2011-02-25' and arrival < '2011-02-28' and COALESCE(created,'2011-02-25') >= '2011-02-20'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...