Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL不在中失败_Sql_Sql Server - Fatal编程技术网

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
),这就是您真正想要的。把你的答案贴出来,这样我就可以接受了。