2010-01-29 105 views
2

我不知道这可能听起来不可思议......但这里是我的情况。我必须从两个表(表1)和(表2)选择行取消选择以前选择

Select * from Table1 Where <SomeCondition> 
Select * from Table2 Where <SomeCondition> 

但我的约束是如果Table1/Table2返回0(零)行...我不应该返回任何结果。

,IE浏览器...如果第一次选择回报说10行,第2个选择返回0(零)行,我应该叫回第一也选择...

是临时表的唯一解决方案,或者我们有其他的选择吗?

预先感谢您的答复...

  • 拉贾

回答

1

一种方法是做一个IF EXISTS第一:

IF EXISTS(SELECT * FROM Table1 WHERE....) AND EXISTS(SELECT * FROM Table2 WHERE....) 
    BEGIN 
     -- Now do your SELECT on each, as both return results 
    END 

EXISTS应该提供良好的性能,它一旦找到匹配的记录就会停下来。

+0

非常感谢你 – 2010-01-29 13:21:12

0

没有您的具体查询的更多细节,这里是一个选项。只要你的查询是不是太复杂的也不是很密集的,这应该工作:

Select * from Table1 Where <SomeCondition> 
where exists(Select null from Table2 Where <SomeCondition>); 
Select null from Table2 Where <SomeCondition> 
where exists (Select null from Table1 Where <SomeCondition>); 

在每个语句这只会选择行如果其他语句也将返回任何的行数大于零。

0

一个明显的,但没有如此高性能的解决方案将是count的行数第一(有关语法不知道):

if not exists(select id from Table1 where ...) or not exists(select id from Table1 where ...) 
    return 

Select * from Table1 Where <SomeCondition> 
Select * from Table2 Where <SomeCondition> 
0

如果您可以使用存储过程,你可以使用@@ ROWCOUNT检查如果第二个查询返回任何结果:

create proc pTest 
as 

Select * from Table1 Where <SomeCondition> 

Select * from Table2 Where <SomeCondition> 
if @@rowcount = 0 return 

go 
+0

这也意味着你没有额外的选择或数据库访问。这也可以通过脚本完成,因此可以在存储过程之外完成。 – Mark 2010-01-29 14:03:33

+0

但是,这是否意味着即使第二个查询不存在任何行,也会执行第一个查询... – 2010-01-29 19:37:51

+1

正确,但至少相同的查询不会运行两次,因为当使用存在时... – edosoft 2010-01-29 20:19:57