如何从数据不存在于日期之间的sql表中获取数据
如何从数据不存在于日期之间的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
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'
)