【问题标题】:SQL Select - return as oneSQL Select - 作为一个返回
【发布时间】:2009-07-07 09:05:59
【问题描述】:

我有一个选择查询。如果没有返回任何行,我想用另一个选择替换那个选择查询。

比如说我有:

Select * from Temp2
if (@@rowcount=0)
 select * from Temp1

在 c# 结束时,我将其作为数据集检索。因此,如果没有返回任何行,它将执行另一个选择。但是这个选择会在 Tables[1] 而不是 Tables[0] 中。

所以本质上,如果@@rowcount = 0,我想要做的是用最后一个选择结果替换sql存储过程中的第一个选择结果。 我确信这是可以做到的。我想要一个整洁的解决方案。

我可以这样做:

if ((select count(ID) from Temp2) =0)
  select * from Temp1
else
  select * from Temp2

但我有 3 个选择。我想用最多 2 个选择来做,因为我的选择语句比给出的简单示例更复杂,我不喜欢重复相同的选择两次(例如在 Temp2 上选择)。

谢谢

【问题讨论】:

    标签: c# asp.net sql sql-server-2005


    【解决方案1】:
    select * from Temp2
    UNION ALL
    select * from Temp1
    where not exists (select * from Temp2)
    

    【讨论】:

    • + 1 欢呼.. 工会都做到了... 因为 temp2 没有 temp1 值,所以最后一个地方没有意义...非常感谢:)
    • 好的,但是如果你删除 where,它总是会返回 Temp1 中的行,即使 Temp2 中有行;这与您在原始问题中的逻辑不同。
    • 我知道.. 我的选择语句有 where 子句来过滤结果.. 它永远不会返回一个结果,其中一个选择中的行也作为另一个选择中的行存在。
    • 这将始终返回来自 Temp1 的记录,即使来自 Temp2 的结果不为空。
    • @Guffa: 如果 (select * from Temp2) 不为空,“不存在”的计算结果为 false,因此在这种情况下它不会从 Temp1 返回任何行。
    【解决方案2】:

    也许是一个表变量?

    declare @result table({column defs})
    
    insert @result
    select (..query 1...)
    
    if(@@rowcount = 0)
      insert @result
      select (..query 2...)
    
    select * from @result
    

    【讨论】:

    • +1 谢谢。但这是一个更复杂的解决方案。但我可能需要在未来使用更复杂的存储过程,所以再次感谢。
    猜你喜欢
    • 2020-05-23
    • 2013-09-22
    • 2011-11-26
    • 1970-01-01
    • 2010-10-27
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多