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