如何从数据不存在于日期之间的sql表中获取数据

如何从数据不存在于日期之间的sql表中获取数据,sql,sql-server,exists,not-exists,Sql,Sql Server,Exists,Not Exists,如何从数据不存在于日期之间的sql表中获取数据 我用三张桌子 客户主 每日调度 空气缸记录 我想找到不在Dailydispatch和EmptyCylinderRecd表中的客户。我已尝试此查询,但未显示预期结果: select * from CustomerMaster where not EXISTS (select * from DailyDispatch where OrderDate between '1/22

如何从数据不存在于日期之间的sql表中获取数据

我用三张桌子

  • 客户主
  • 每日调度
  • 空气缸记录
  • 我想找到不在
    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')
    
    然后试试这个:

    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
    的列,并使用适当的索引,效果会更好
    在上面<代码>联合将给出查询1和查询2的通用结果。按照其他建议,在性能方面使用
    不存在

    如果DailyDispatch或EmptyCylinderRecd中的[Name]列可以为null(列定义),我会投票反对不在解决方案中的列,因为这可能会导致不正确的结果

    相反,我会使用“不存在”的方法:

    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标准,以避免由于设置日期格式而导致错误结果或错误。

    能否显示表格结构?表格之间的关系是什么???三个表格之间的关系是名称是通用的field@Sarvan-您希望客户出现在表1中,但不是在2,3中?@BoratSagdiyev确切地说,我希望表1中的客户不在表2,3中。也许你的意思是“不在”而不是“不在”?[OrderDate]和[Date]参数的转换不再是可搜索的,导致表扫描,即使存在支持索引。此外,如果内部select中的列可以有空值,NOT IN可能返回不正确的结果。因此,我强烈反对该解决方案。@Ganesh_Devlekar-谢谢你的回答,但我想检查两个表中不存在数据的,我想显示dailydispatch和EmptyCylreturn表中不存在的通用名称。此查询显示union。
    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') 
    
    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'
        )