如何使用Exists语句以及主表上的条件获取匹配的记录

时间:2017-05-10 13:50:56

标签: sql sql-server database sql-server-2008 exists

我对sql存在问题'存在'声明,我将非常感谢任何帮助 让我解释一下我需要完成的任务。

我有两个表,我希望从table1中获取匹配的记录,这些记录也会在table2中退出。直到这个,很简单。但是,我还希望从table1获取这些记录以及Table1中具有特定列NULL的匹配记录。换句话说,我需要从Table1中获取这些记录,或者它们存在于Table2中,或者它们具有特定的列NULL。我编写了以下查询来完成此任务。

CREATE TABLE #Table1(ID INT, Column2 INT NULL)

CREATE TABLE #Table2(ID INT)

INSERT INTO #Table1 VALUES(1, NULL)

INSERT INTO #Table2 VALUES(2)

select * from #Table1
WHERE EXISTS (SELECT NULL from #Table2 where #Table2.ID = #Table1.ID OR #Table1.Column2 IS NULL)

DROP TABLE #Table1;

DROP TABLE #Table2;

当Table2不为空时,此查询有效。但是,如果Table2为空,则IS NULL条件不起作用。

为了解决这个问题,我还尝试添加一个虚拟记录,以防Table2因添加联合而为空,但它也无法解决我的问题,因为当我得到0条记录时总会有记录。

喜欢这个

select * from #Table1
WHERE EXISTS (SELECT ID WHERE NOT EXISTS (SELECT * FROM #Table2) 

UNION 

SELECT NULL from #Table2 where #Table2.ID = #Table1.ID OR #Table1.Column2 IS NULL)

注意:我知道这可以使用连接来解决,但我想使用Exists语句来解决它,因为这是大型系统的一部分,它根本无法转换为连接。我已将上述内容作为一个简单的场景。

任何形式的帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

这会有用吗?

 WHERE EXISTS (SELECT 1 from #Table2 where #Table2.ID = #Table1.ID) OR #Table1.Column2 IS NULL

答案 1 :(得分:0)

将条件移到EXISTS之外。它更接近于你如何描述问题:

select t1.*
from #Table1 t1.
WHERE t1.Column2 IS NULL OR
      EXISTS (SELECT 1 from #Table2 t2 where t2.ID = t1.ID);

注意:

  • 虽然允许EXISTS (SELECT NULL . . . )作品,但我发现它具有很强的误导性。在实践中,NULL通常代表缺少值,因此结果是一些认知失调。此外,SELECT 1更容易输入。
  • 我推荐表别名;它们使查询更容易编写和阅读。