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

yield return意図された動作は、 C#の場合と同じです。SELECTどのステートメントが実際に結果の一部であり、どのステートメントが結果の一部ではないかをビューに伝える方法はありますか?私が必要とするものに先行する小さな計算にもselectが含まれているためです。

ありがとうございました!

4

2 に答える 2

2

C#でのyield returnは、基になる関数に表示される行を一度に1つずつ返します。この概念はSQLステートメントには存在しません。SQ1はセットベースであり、概念的には1つの単位として結果セット全体を返します。(とはいえ、クエリの実行が遅く、行がゆっくりまたはバッチで返されることがあります。)

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 に答える
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 に答える