2009-06-10 34 views
0

我不喜歡在兩個地方定義相同的東西,如果我能避免它。我認識到下面的兩個查詢處理兩個不同的表,但這些表基本上擁有相同類型的數據(不同的謂詞保證兩個查詢),我認爲下面的兩個投影是「定義相同的東西在兩個地方「。重構SQL投影?

當/如果我在以後修改這些查詢,包括不同的欄目,我敢肯定,我會永遠想的預測保持一致。

假設,並且不使用動態SQL,並沒有「*」在任何投影(在我的生產環境不允許的),我可以定義「columnset」一次,在這兩個查詢使用它?

SELECT columnA 
    , columnB 
    , columnC 
FROM Data 

SELECT columnA 
    , columnB 
    , columnC 
FROM DataArchive 
+0

你有數據存儲在兩個地方。無論如何,爲了檢索任何給定調用所需的數據,您需要知道要從中檢索哪組數據。發佈的SELECT ... UNION ALL ...解決方案只會導致需要一個查詢,但您需要添加「開關」來控制實際查詢的集合。你可以把它添加到你的代碼庫嗎?我更喜歡Blixt的視圖實現,但我也建議考慮將這些表合併成一個表。 (這聽起來像是「當前/小型/常用套裝與歷史/極度/罕用套裝」的情況,但你永遠不知道。) – 2009-06-10 18:27:20

回答

1

有你的基地,在數據和DataArchive的工會和使用內聯表值函數(SQL Server 2005和了)?

CREATE FUNCTION UnifiedData (@LiveOnly bit, @ArchiveOnly bit) 
RETURNS TABLE 
AS 
RETURN (
    SELECT columnA 
      ,columnB 
      ,columnC 
    FROM (
     SELECT 'Live' AS Src, * 
     FROM Data 
     WHERE @ArchiveOnly = 0 

     UNION ALL 

     SELECT 'Archive' AS Src, * 
     FROM DataArchive 
     WHERE @LiveOnly = 0 
    ) 
) 

不是很好,但應該由優化器處理,因爲它已被內聯。

+0

我喜歡它。我現在在問題中加入了'*'禁止。我最初沒有包括它的道歉。 – lance 2009-06-10 16:18:14

0

我想不出有效的方法。當然,你可以使用兩個表中的UNION ALL進行查看,並添加一個將表名保存爲字符串的列,然後執行SELECT columnA, columnB, columnC FROM view WHERE table = 'Data',但感覺像是一個相當醜陋的黑客攻擊。

0

呀,SQL是可怕的這種方式。沒有全面的令人滿意的方式來做到這一點。以下是使用同義詞的示例:

if object_id('DataSynonym') is not null drop synonym DataSynonym 
create synonym DataSynonym for Data 
select columnA, columnB, columnC from DataSynonym 

if object_id('DataSynonym') is not null drop synonym DataSynonym 
create synonym DataSynonym for DataArchive 
select columnA, columnB, columnC from DataSynonym 

這種使用同義詞的問題是它們在全局範圍內。如果您在一個連接中即時重新定義同義詞,則會影響所有其他連接上的用戶。

臨時視圖/函數或視圖/函數變量會走很長的路來解決這個問題。或者像SAS中可用的宏語言。

0

創建的數據UNION ALL DataArchive視圖。如果您稍後能夠重構和合並這兩個表格,這對您現有的查詢將是透明的。