2017-01-02 112 views
1

我有代碼的圖如下生成視圖SQL動態

create view v1 
as 
section1 --I get column1 data here 
union all 
section2 --I get column2 data here 
union all 
section3 --I get column3 data here 

現在,這種觀點是在多個地方使用,並且將在列1或2或3,取決於在這裏我們使用這個類的地方接合下面。

select * from tabl1 t1 join v1 on t1.column1 = v1.column1 
select * from tabl1 t2 join v1 on t2.column2 = v1.column2 

但如果是在列1,對於column2,3即計算的加盟,則不需要第2,3。根據當前的業務規則,我們不能將視圖分成多個視圖。現在,我需要的是,如果視圖被加入到column1,section2,3不應該被計算出來,類似的情況與column2,section1,3和column3,section1,2

有人可以請幫助我如何實現這一點

感謝, SREE

+0

可以共享的結果集預期輸出的結構 – balaji

+0

有時SQL服務器會優化izer可以忽略'union all'的不需要的部分。你看過查詢計劃嗎? – Arvo

+0

A **查看**是一個(有時)複雜** SELECT **的簡寫。如果你需要一個變量視圖,可以定義不同的視圖,每個視圖一個,或者簡單地使用顯式的SELECT(s)。如果你關心的是性能,這將是最有效的方法。 – FDavidov

回答

3

爲了暗示,它並不需要產生任何行(以及那些沒有做任何計算)在一個特定的工會子查詢優化器,你必須告訴它你不實際上需要信息。在某些情況下,這將是足夠的,只是不SELECT *(即未選擇v1.column2v1.column3):

select t1.*, v1.column1 from tabl1 t1 join v1 on t1.column1 = v1.column1 
select t1.*, v1.column2 from tabl1 t2 join v1 on t2.column2 = v1.column2 

有可能是邊緣的情況下優化器仍然不能證明計算是不需要的,這取決於你的實際看法。在這種情況下,它可以幫助有一個恆定的柱,明確區分各子查詢:

create view v1 
as 
select 'section1' AS discriminator 
-- rest of section1 
union all 
select 'section2' AS discriminator 
-- rest of section2 
union all 
select 'section3' AS discriminator 
-- rest of section3 

而現在,在您的查詢中使用的常數以及(不綁定變量)來選擇鑑別:

select t1.*, v1.column1 
from tabl1 t1 join v1 on t1.column1 = v1.column1 
where discriminator = 'section1' 

select t1.*, v1.column2 
from tabl1 t2 join v1 on t2.column2 = v1.column2 
where discriminator = 'section2' 

當然,在這一點上,有人可能想知道你是否也許不是應該創建3點不同的意見,並從中直接選擇,但我不知道你的要求......