SQL查询产生意外结果

时间:2014-06-24 13:21:43

标签: sql sql-server-2008-r2

我遇到了两个没有产生预期结果的SQL查询的奇怪情况。以下是查询:

查询1:

SELECT DISTINCT SomeCharValue FROM Table1 JOIN Table2 ON Table1.SomeCharValue = Table2.SomeCharValue ORDER BY SomeCharValue

查询2:

SELECT DISTINCT SomeCharValue FROM Table1 JOIN Table2 ON Table1.SomeCharValue <> Table2.SomeCharValue ORDER BY SomeCharValue

我有两个包含varchar(15)列的表。表2基本上是表1中值的一小部分,因此Table1具有存储在表2中的所有值。问题是,两个查询永远不会产生相同的结果,但它们确实如此。两个查询都会为某些值产生相同的结果;例如,如果Table1和Table2包含单词'hello',则Query 1应该返回它,而Query 2则不应该返回它。但是,BOTH查询返回'hello'。两个表中的'hello'是否相等且不同时是没有意义的。我运行了一个长度查询来测试值,有些是带有尾随空格的不同大小,但即使将这些更改为精确匹配,并且验证字符的十六进制值是相同的,也会出现相同的结果。我无法比较数字键字段,因为这些表之间没有关键关系。我只能比较列中的确切字符值。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

想象一下,您将table1包含ab作为单独的行,而table2具有完全相同的内容。

现在进行第二次查询,将table1的行a与table2中的两行进行比较。在与table2中的行b进行比较时,它将传递ON子句,因此a将在您的结果集中。类似地,table1中的b行将与表2中的a行进行比较时传递ON子句。

您可以将查询重写为

SELECT DISTINCT SomeCharValue FROM TABLE1 WHERE SomeCharValue NOT IN (SELECT DISTINCT SomeCharValue FROM Table2) ORDER BY SomeCharValue

答案 1 :(得分:0)

您是否尝试使用NOT LIKE而不是&lt;&gt;