2017-01-02 8 views
1

ich eine Ansicht mit Code haben wie folgtgenerieren Ansicht SQL dynamisch

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 

nun diese Ansicht an mehreren Stellen verwendet wird, und wird auf column1 oder 2 oder 3 auf dem Ort abhängig verbunden werden, wo wir diese wie verwenden unten.

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

etc

Aber wenn es auf column1 beitritt, Berechnung für column2,3 d.h, Abschnitt 2,3 ist nicht erforderlich. Gemäß den aktuellen Geschäftsregeln können wir die Ansicht nicht in mehrere Ansichten aufteilen. Nun, was ich brauche, ist, dass, wenn Ansicht in Spalte1 verbunden wird, Abschnitt2,3 sollte nicht berechnet werden und ähnlich ist der Fall mit Spalte2, Abschnitt1,3 und Spalte3, Abschnitt1,2

Könnte mir bitte jemand helfen, wie dies zu erreichen

Danke, Sree

+0

können Sie die Ergebnismenge teilen Struktur der erwarteten Ausgabe – balaji

+0

Manchmal SQL Server optim Izer kann nicht benötigte Teile von "union all" selbst ignorieren. Haben Sie Abfragepläne betrachtet? – Arvo

+0

A ** View ** ist eine Abkürzung für einen (manchmal) komplexen ** SELECT **. Wenn Sie eine Variablenansicht benötigen, definieren Sie entweder unterschiedliche Ansichten, eine für jeden Fall, oder verwenden Sie einfach die expliziten SELECT (s). Wenn Ihr Anliegen Leistung ist, wäre dies der effizienteste Ansatz. – FDavidov

Antwort

3

um die optimiser anzudeuten, dass es keine Zeilen zu erzeugen, benötigt (und die jede Berechnung nicht) in einer bestimmten Gewerkschaft subquery, haben Sie es zu sagen, dass Sie don‘ Ich brauche eigentlich die Info. In einigen Fällen wäre es (nicht wählen v1.column2 und v1.column3 ie) nur nicht SELECT * ausreichend sein:

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 

Es können Grenzfälle geben, in denen der Optimierer kann immer noch nicht unter Beweis stellen, dass die Berechnung nicht benötigt wird, abhängig von Ihrer aktuellen Ansicht . In diesen Fällen kann es helfen, eine konstante Spalte zu haben, die eindeutig jede Unterabfrage unterscheidet:

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 

Und jetzt, eine Konstante in Ihrer Abfrage zu verwenden, als auch (nicht eine Bindevariable) den Diskriminator wählen:

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' 

natürlich an dieser Stelle kann man sich fragen, ob Sie vielleicht nicht 3 verschiedene Ansichten und wählen Sie direkt von ihnen schaffen sollte, aber ich weiß nicht, Ihre Anforderungen ...