查询使用!= On LEFT JOIN表返回无结果

时间:2017-06-14 17:03:34

标签: sql-server database join

我正在查询Microsoft SQL Server 2012。

主表(T1)结构包含帐户详细信息:

AccountID,名称,地址

此表将被删除并每晚使用外部数据重新创建。我们需要显示这些信息,但也需要排除一些记录。由于我们无法访问外部数据,因此我们无法添加列。

因此我们创建了一个表格(T2)来标记我们要排除的所有帐户。它只有两个字段:

AccountNo,输入

因此我们填充了T2,并且对于我们想要从显示中排除的每个帐户,我们为“类型”字段提供了值' ex' (排除)。我们没有要显示的帐户的条目。

当我执行以下查询时:

    select T1.AccountID as acct, T1.Name as name, T1.Address as add
    from T1        
    left join T2 on T1.AccountID = T2.AccountNo
    WHERE T2.Type != 'ex'

以上查询返回并清空设置。

如果我运行查询以查找值' ex' (删除!):

    select T1.AccountID as acct, T1.Name as name, T1.Address as add
    from T1        
    left join T2 on T1.AccountID = T2.AccountNo
    WHERE T2.Type = 'ex'

查询会返回包含' ex'填充的字段的行,如您所料。

我可以成功搜索NULL或NOT null但是我们需要使用这个额外的表来进行其他数据操作。换句话说,我们不只是用" ex"。

来填充这个字段

我想知道为什么我不能通过查找字符串的布尔值false来查询联接表中的字段。是因为列中没有连接(T2)的列,它实际上并不存在于数据集中吗?

如果是这样的话,我将如何执行查询以返回与联接表中的值不相等的记录,无论该记录是否存在于联接表中。

1 个答案:

答案 0 :(得分:1)

您可以使用评论中提到的ISNULL解决方案。

您可以编写查询的另一种方法是:

SELECT #t1.AccountID AS acct, #t1.Name AS [name], #t1.Address AS [add]
FROM #t1        
LEFT JOIN #t2 ON #t1.AccountID = #t2.AccountNo
             AND #t2.type = 'ex' --In case you add additional types to #t2
WHERE #t2.AccountNo IS NULL;