在SQL Server中的Yield返回等价物

时间:2012-11-08 14:22:29

标签: sql sql-server view yield

我在SQL服务器(DWH)中写下了一个视图,用例伪代码是:

-- Do some calculation and generate #Temp1
-- ... contains other selects

-- Select statement 1
SELECT * FROM Foo
JOIN #Temp1 tmp on tmp.ID = Foo.ID
WHERE Foo.Deleted = 1

-- Do some calculation and generate #Temp2
-- ... contains other selects

-- Select statement 2
SELECT * FROM Foo
JOIN #Temp2 tmp on tmp.ID = Foo.ID
WHERE Foo.Deleted = 1

视图的结果应为:

Select Statement 1
UNION
Select Statement 2

预期行为与C#中的yield return相同。有没有办法告诉视图哪些SELECT语句实际上是结果的一部分,哪些不是?因为在我需要之前的小计算也包含选择。

谢谢!

2 个答案:

答案 0 :(得分:2)

C#中的yield返回一次返回一行,因为它们出现在某个底层函数中。 SQL语句中不存在此概念。 SQl是基于集合的,从概念上作为一个单元返回整个结果集。 (也就是说,有时查询运行缓慢,您会看到行缓慢或分批返回。)

您可以使用TOP(在SQL Server中)控制返回的行数。您可以使用WHERE语句选择要返回的特定行。但是,您不能指定有条件地从某些组件返回行而不是其他组件的UNION语句。

你最接近的可能是:

if UseTable1Only = 'Y'
    select *
    from Table1
else if UseTable2Only = 'Y'
    select *
    from Table2
else
    select *
    from table1
    union
    select *
    from table2

您可以使用动态SQL执行类似操作,方法是将语句构造为字符串,然后执行它。

答案 1 :(得分:2)

我找到了更好的解决方法。它可能对其他人有帮助。它实际上包括WITH语句中的所有计算,而不是在视图核心中执行它们:

WITH Temp1 (ID)
AS
(
    -- Do some calculation and generate #Temp1
    -- ... contains other selects
)

, Temp2 (ID)
AS
(
    -- Do some calculation and generate #Temp2
    -- ... contains other selects
)

-- Select statement 1
SELECT * FROM Foo
JOIN Temp1 tmp on tmp.ID = Foo.ID
WHERE Foo.Deleted = 1

UNION

-- Select statement 2
SELECT * FROM Foo
JOIN Temp2 tmp on tmp.ID = Foo.ID
WHERE Foo.Deleted = 1

结果当然是所有外部UNION陈述的SELECT