2015-03-07 4 views
0

У меня есть следующий запрос, и мне нужно его, чтобы вернуть все нулевые значения между этими двумя датами.Возвратите все значения null между двумя датами

select cust_first_name 
from customers 
join orders using(customer_id) 
where order_date between (to_date('01-01-2007','DD-MM-YYYY')) 
        and (to_date('31-12-2008','DD-MM-YYYY')); 
+0

нулевых значений какой колонки? Вам нужен счет? (Список нулей не особенно интересен.) – Mat

+0

Мне нужно первое имя клиентов, у которых нет зарегистрированных заказов между этими датами. Его нулевое значение столбца order_date. –

+0

Если этот столбец имеет значение NULL, он не может находиться между двумя датами. Вы должны основывать свой поиск по другим критериям. – Mat

ответ

2

Звучит так, как вы хотите, это клиенты без заказов в течение заданного диапазона дат. Соединение, которое вы используете, находит противоположное.

Вы можете сделать это с помощью внешнего соединения, и в этом случае вам необходимо применить фильтр даты до соединения. Это, вероятно, проще и более удобным для чтения использовать NOT IN или NOT EXISTS подзапрос:

select cust_first_name 
from customers 
WHERE customers.customer_id NOT IN (
    SELECT orders.customer_id from orders 
    where order_date between (to_date('01-01-2007','DD-MM-YYYY')) 
         and (to_date('31-12-2008','DD-MM-YYYY')) 
) 
+0

Это то, что мне нужно, я просто не знал, чтобы объяснить себя! Большое спасибо! –

+1

Это не будет работать, если 'ORDERS.customer_id' имеет в нем значение« NULL ». В этом случае вы захотите использовать 'NOT EXISTS'. –

-1

Вот пример того, как сделать то, что вы хотите.

Ключевая часть делает левый присоединиться на вашем столе заказов, а затем просто делать не между date1 и date2

declare @customers table (
    id int identity(1,1), 
    first_name nvarchar(50), 
    last_name nvarchar(50) 
) 

declare @orders table (
    id int identity(1,1), 
    customer_id int, 
    order_date datetime 
) 

insert into @customers(first_name, last_name) values ('bob', 'gates') 
insert into @customers(first_name, last_name) values ('cyril', 'smith') 
insert into @customers(first_name, last_name) values ('harry', 'potter') 

insert into @orders(customer_id, order_date) values (1, '2007-02-01') 
insert into @orders(customer_id, order_date) values (2, '2015-02-15') 
insert into @orders(customer_id, order_date) values (3, '2008-02-15') 

select 
    customers.id 
    ,customers.first_name 
    ,customers.last_name 
from @customers customers 
    left join @orders orders on orders.customer_id = customers.id 
where orders.id is null 
    or orders.order_date not between ('2007-01-01') and ('2008-12-31') 
group by 
    customers.id 
    ,customers.first_name 
    ,customers.last_name; 
+0

Я не думаю, что решение SQL Server сделает OP очень хорошим. –