我正在查询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)的列,它实际上并不存在于数据集中吗?
如果是这样的话,我将如何执行查询以返回与联接表中的值不相等的记录,无论该记录是否存在于联接表中。
答案 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;