2017-07-24 10 views
1

Ich führe SQL Server 2016 Management Studio. Zur Zeit habe ich die folgenden UnterabfragestrukturSQL dynamische Unterabfragen

WITH x_1 AS 
    (SELECT 
     -- Code A here -- 
     column_1  
     -- Code B here -- 
    ), 
x_2 AS 
    (SELECT 
     -- Code A here -- 
     column_2  
     -- Code B here -- 
    ) 
SELECT 
-- Rest of the code -- 

So im Wesentlichen ich die gleichen Code-Snippets für beide Unterabfragen („Code A“ und „Code B“) mit Ausnahme der Bezugnahme auf eine andere Spalte am Durchführung in zwischen. Um unnötige Wiederholungen zu vermeiden, könnte ich in anderen Programmiersprachen z. tun etwas entlang der Linien des folgenden Pseudo-Code Schnipsel

varnames = ["x_1", "x_2"] 
colnames = ["col_1", "col_2"] 

for (i in 1:2){ 
    eval(varnames[i]) = function(name = colnames[i]){Code A, eval(name), Code B} 
} 

heißt, eine Schleife über den Codeblöcken doppelt so groß ist und die Variable dynamisch und Spaltennamen auszuwerten. Leider weiß ich nicht, wie man das in SQL macht. Irgendwelche Ideen, wie es erreicht werden könnte? Ist dieser Ansatz in SQL sinnvoll oder gibt es geeignetere Methoden, um das gleiche Ergebnis zu erzielen?

+0

Klingt nach etwas, das Sie in einer gespeicherten Prozedur tun könnten. –

Antwort

1

Ein Schleifenansatz ist in SQL nicht sinnvoll, da satzbasierte Ansätze ausnahmslos bessere Ergebnisse liefern.

Ohne zu wissen, was "Code A" und "Code B" tatsächlich sind, ist es schwierig, eine ideale Lösung mit 100% iger Sicherheit vorzuschlagen. Wenn ich jedoch sage, dass sie bis auf die eine Spalte identisch sind, würde ich vorschlagen, die beiden CTEs zu einem CTE zu kombinieren, das entweder beide Spalten enthält, oder wenn die beiden Spalten denselben Alias ​​verwenden, CASE-Ausdruck für column_1 geeignet für die zusätzliche Spalte und column_2 ansonsten.