通过对Micrsoft SQL Server 2008(10.0.1600.22 / Service Pack 2)的查询,我得到了意外的结果。可能是错误吗?我试图创建一个类似的查询来复制问题-没有成功。因此,我猜查询本身没有错,但是其他原因导致了这种奇怪的行为。我希望对可能导致问题的原因提出一些建议。首先,看一下这个工作示例:DROP TABLE #TempTypeDROP TABLE #TempDataSELECT * INTO #TempType FROM ( SELECT 1 AS Id, 10 AS TempDataFK, 'Do' AS Name, 'CODE1' AS Type UNION SELECT 2 AS Id, 10 AS TempDataFK, 'Re' AS Name, 'CODE2' AS Type UNION SELECT 3 AS Id, 20 AS TempDataFK, 'Mi' AS Name, 'CODE2' AS Type UNION SELECT 5 AS Id, 10 AS TempDataFK, 'Fa' AS Name, 'CODE3' AS Type UNION SELECT 6 AS Id, 20 AS TempDataFK, 'So' AS Name, 'CODE4' AS Type) subSELECT * INTO #TempData FROM ( SELECT 10 AS Id, 150 AS Number UNION SELECT 20 AS Id, 150 AS Number UNION SELECT 30 AS Id, 150 AS Number UNION SELECT 40 AS Id, 180 AS Number) subSELECT C1.Name Name1, C2.Name Name2, C3.Name Name3, C4.Name Name4, #TempData.Id, #TempData.NumberFROM #TempData LEFT JOIN #TempType C1 (NOLOCK) ON #TempData.Id = C1.TempDataFK AND C1.Type = 'CODE1' LEFT JOIN #TempType C2 (NOLOCK) ON #TempData.Id = C2.TempDataFK AND C2.Type = 'CODE2' LEFT JOIN #TempType C3 (NOLOCK) ON #TempData.Id = C3.TempDataFK AND C3.Type = 'CODE3' LEFT JOIN #TempType C4 (NOLOCK) ON #TempData.Id = C4.TempDataFK AND C4.Type = 'CODE4'WHERE 1=1 AND (#TempData.Number = 150) AND (C1.Name='Mi' OR C2.Name='Mi' OR C3.Name='Mi' OR C4.Name='Mi')如您所见,我将表TempType联接到TempData的次数是四次。每次给它一个不同的别名。然后,我用某个数字(150)进行过滤,并希望至少一个Names应该是'Mi'。结果是预期的:--------------------------------------------Name1 Name2 Name3 Name4 Id NumberNULL Mi NULL So 20 150--------------------------------------------但是,如果我对客户数据库运行类似的查询,则会得到:--------------------------------------------Name1 Name2 Name3 Name4 Id NumberDo Re Fa NULL 10 150NULL Mi NULL So 20 150NULL NULL NULL NULL 30 150--------------------------------------------好像过滤中未使用与(C1.Name='Mi' OR C2.Name='Mi' OR C3.Name='Mi' OR C4.Name='Mi')相似的部分。查询不同,但结构相同在客户端数据库上,表不是临时的,它们已经包含数据。这些表还具有其他各个字段,但我仍然只剩下与另一个表联接。因此与上述相同。无法在新数据库中复制我试图通过创建一个仅影响表和字段的新数据库来复制问题,但是复制问题没有成功。模式还值得一提的是,客户数据库包含多个架构。与TempData和TempType相似的两个表都属于同一架构(不是dbo)。另外,类似于TempType.Type的字段是另一个模式中另一个表的外键,但是由于我们没有加入,我看不到它是否有意义?另一个特点如果我将C1.Name等作为我的SELECT的一部分,则如下所示:SELECT C1.Name Name1, C2.Name Name2, C3.Name Name3, C4.Name Name4, #TempData.Id, #TempData.Number, CASE WHEN (C1.Name = 'Mi' AND C1.Name IS NOT NULL) THEN 1 ELSE 0 END, CASE WHEN (C2.Name = 'Mi' AND C2.Name IS NOT NULL) THEN 1 ELSE 0 END, CASE WHEN (C3.Name = 'Mi' AND C3.Name IS NOT NULL) THEN 1 ELSE 0 END, CASE WHEN (C4.Name = 'Mi' AND C4.Name IS NOT NULL) THEN 1 ELSE 0 END我对我的客户数据库(只有一行)得到了预期的结果:Name1 Name2 Name3 Name4 Id Number (No column name) (No column name) (No column name) (No column name)NULL Mi NULL So 20 150 0 1 0 0有什么建议可能导致这种情况吗? 最佳答案 请确保本地数据库设置和客户端的ansi_null设置相同。像“名称不为空”之类的样式将返回所需的结果,而不是取决于ansi_null设置的“名称= / 空”之类的结果。检查ansi_null:http://msdn.microsoft.com/en-us/library/ms188048(v=sql.105).aspx
10-06 08:19
查看更多