2014-10-11 3 views
0

Как получить данные из таблицы SQL, где данные не присутствует в между датамиКак получить данные из таблицы SQL, где данные не присутствуют в между датами

Я использую три таблицы

  1. Customer Master
  2. Ежедневная рассылка
  3. EmptyCylinderRecd

Я хочу, чтобы найти клиентов которые не находятся в таблицах Dailydispatch и EmptyCylinderRecd. Я попробовал этот запрос, но ожидаемые результаты не отображаются:

select * 
from CustomerMaster 
where 
    not EXISTS (select * 
       from DailyDispatch 
       where OrderDate between '1/22/2014' and '08/10/2014') or 
    not exists (select * 
       from EmptyCylinderRecd 
       where Date between '1/22/2014' and '08/10/2014') 
+2

Можете ли вы показать структуру таблицы? – Jens

+2

Какая связь между таблицами ??? –

+0

Отношение между тремя таблицами: Имя является общим полем – Sarvan

ответ

0
Name is the common field 

попробуйте следующее:

select * 
from CustomerMaster where Name NOT IN 
(select Name from DailyDispatch 
where CAST(OrderDate as DATE) between '2014-01-22' and '2014-08-10' 
and Name is NOT NULL) 

union 

select * 
from CustomerMaster where Name NOT IN 
(select Name from EmptyCylinderRecd 
where CAST(Date as DATE)between '2014-01-22' and '2014-08-10' 
and Name is NOT NULL) 

Примечание: Это будет лучше, если Вы используете колонки что-то вроде CustomerID с правильной индексацией на нем. Union даст общие результаты от query1 и query2. Используйте Not Exists в терминах производительности, как и другие. NOT IN vs NOT EXISTS

+0

Возможно, вы имеете в виду «НЕ В», а не просто «НЕ»? –

+0

@JoachimIsaksson Обновлено спасибо –

+0

С преобразованием [OrderDate] и [Date] аргументы уже не SARGable, что приводит к сканированию таблицы, даже если присутствует поддерживающий индекс. Кроме того, NOT IN может возвращать неверные результаты, если столбец во внутреннем select может иметь значения NULL. Поэтому я решительно проголосовал против этого решения. – Lmu92

0
SELECT * 
FROM customermaster C 
WHERE NOT EXISTS (SELECT 1 
        FROM dailydispatch D 
        WHERE C.NAME = D.NAME 
         AND D.orderdate BETWEEN '2014-22-1' AND '2014-08-10') 
     OR NOT EXISTS (SELECT 1 
         FROM emptycylinderrecd E 
         WHERE C.NAME = E.NAME 
           AND E.date BETWEEN '2014-22-1' AND '2014-08-10') 
0

Если [Имя] столбец в DailyDispatch или EmptyCylinderRecd может быть нулевым (определение столбца) Я бы голосовать agaist на NOT IN решения, так как это может привести к неверным результатам.

Вместо этого, я бы использовать «НЕ СУЩЕСТВУЕТ» подход:

SELECT cm.* 
FROM CustomerMaster cm 
WHERE 
NOT EXISTS 
    (SELECT 1 
    FROM DailyDispatch dp 
    WHERE cm.YourCol1 = dp.YourCol1 AND dp.OrderDate BETWEEN '20140122' and '20140810' 
    ) 
OR NOT EXISTS 
    (SELECT 1 
    FROM EmptyCylinderRecd ecr 
    WHERE cm.YourCol1 = ecr.YourCol1 AND ecr.[Date] BETWEEN '20140122' and '20140810' 
    ) 

Пожалуйста, обратите внимание, что я изменил формат даты ISO уступчивый, чтобы избежать ошибочных результатов или ошибок, связанных с установкой DATEFORMAT ,