SQL不在中失败
我正在处理一个查询,如果主表上不存在记录,该查询将检查临时表。我的问题是这样的SQL不在中失败,sql,sql-server,Sql,Sql Server,我正在处理一个查询,如果主表上不存在记录,该查询将检查临时表。我的问题是这样的 SELECT * FROM [Telemarketing].[dbo].[PDCampaignBatch_temp] WHERE [StartDateTime] NOT IN (SELECT [StartDateTime] FROM [Telemarketing].[dbo].PDCampaignBatch GROUP BY [StartDateTime]) 但问题是它不显示这一行 即使我的主表中不存在该数据。有
SELECT * FROM [Telemarketing].[dbo].[PDCampaignBatch_temp]
WHERE [StartDateTime] NOT IN (SELECT [StartDateTime] FROM [Telemarketing].[dbo].PDCampaignBatch GROUP BY [StartDateTime])
但问题是它不显示这一行
即使我的主表中不存在该数据。有什么问题吗?
不在
中有奇怪的语义。如果子查询中的任何值为NULL
,则查询将不返回任何行。因此,我强烈建议使用不存在
:
SELECT t.*
FROM [Telemarketing].[dbo].[PDCampaignBatch_temp] t
WHERE NOT EXISTS (SELECT 1
FROM [Telemarketing].[dbo].PDCampaignBatch cb
WHERE t.StartDateTime = cb.StartDateTime
);
最有可能的问题是日期时间。您可能只显示一定程度的洞察力,如年/月/日。数据可存储为年/月/日/小时/分/秒/毫秒。如果是这样的话,您必须匹配数据的最粒度测量值。如果一个字段是日期,另一个字段是日期时间,那么它们也可能永远不会匹配。因此,您总是得不到响应。如果SQL NOT IN条件计算的集合包含任何空值,则此处的外部查询将返回空集合,即使PDCampaignBatch表中有许多[StartDateTime]与[StartDateTime]匹配 为了避免这样的问题,
SELECT *
FROM [Telemarketing].[dbo].[PDCampaignBatch_temp]
WHERE [StartDateTime] NOT IN (
SELECT DISTINCT [StartDateTime]
FROM [Telemarketing].[dbo].PDCampaignBatch
WHERE [StartDateTime] IS NOT NULL
);
假设
PDCampaignBatch_temp
和PDCampaignBatch
恰好具有相同的结构(相同的列以相同的顺序排列),您的任务是获取PDCampaignBatch_temp
中不在PDCampaignBatch
中的所有行的集合。最有效的方法是使用操作符,它也将以预期的方式处理NULL
:
SELECT * FROM [Telemarketing].[dbo].[PDCampaignBatch_temp]
EXCEPT
SELECT * FROM [Telemarketing].[dbo].[PDCampaignBatch]
在非一次性的生产代码中,不要使用
选择*
,而是写出列名。您可以尝试,除了。如果要查找除主表中已存在的行以外的所有行(假设所有列都匹配,而不仅仅是StartDateTime
),这就是您真正想要的。把你的答案贴出来,这样我就可以接受了。