2

我在 SQL Server (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语句实际上是结果的一部分,哪些不是?因为在我需要之前的小计算也包含选择。

谢谢!

4

2 回答 2

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陈述的结果。

于 2012-11-09T09:25:26.117 回答
2

C# 中的 yield return 一次返回一行,因为它们出现在一些底层函数中。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 执行类似的操作,方法是将语句构造为字符串然后执行它。

于 2012-11-08T14:30:11.057 回答