2013-08-01 30 views
0

我有一個表,名爲FacilityDatabaseConnection一樣,所以, ID,FacilityID,DatabaseTypeID,的ConnectionString計算字段,選擇基礎上的ID 2

所以給予FacilityID和DatabaseTypeID對你會得到一個ConnectionString的。 設施和數據庫類型表都有「名稱」字段。 我想提出一個「名稱」字段中FacilityDatabaseConnection做到以下幾點,

SELECT (dbo.Facility.Name+' - '+dbo.DatabaseType.Name) as Name 
FROM dbo.FacilityDatabaseConnection 
INNER JOIN dbo.Facility 
ON dbo.FacilityDatabaseConnection.FacilityID = dbo.Facility.ID 
INNER JOIN dbo.DatabaseType 
ON dbo.FacilityDatabaseConnection.DatabaseTypeID = dbo.DatabaseType.ID 

所以它返回「FacilityName - 數據庫類型」

這可以作爲一個查詢,但有可能使這是一個領域?


我試過,

ALTER TABLE dbo.FacilityDatabaseConnection 
ADD Name AS (SELECT (dbo.Facility.Name+' - '+dbo.DatabaseType.Name) as Name 
FROM dbo.FacilityDatabaseConnection 
INNER JOIN dbo.Facility 
ON dbo.FacilityDatabaseConnection.FacilityID = dbo.Facility.ID 
INNER JOIN dbo.DatabaseType 
ON dbo.FacilityDatabaseConnection.DatabaseTypeID = dbo.DatabaseType.ID) PERSISTED 

這給了我一個錯誤「子查詢在這種情況下是不允許的。只有標量表達式是允許的。」

有沒有辦法實現這一目標,或者這樣的計算領域是不可能的?

+0

你必須使用視圖來產生這樣的一個派生視圖。 –

回答

2

假設這是SQL Server,計算列不能引用其他表,所以你所建議的是不可能的。

參見http://msdn.microsoft.com/en-us/library/ms191250%28v=sql.105%29.aspx

您應該使用視圖/函數/存儲過程來代替。

+0

好的,那邊的問題。 做一個視圖/函數/ SP來做這件事,而不是隻是在我的程序中做一個查詢,而不是僅僅製作一個常規字段並手動將其命名爲這樣做會有好處嗎? 我能想到的唯一的事情就是手冊會佔用更多的空間,但速度會更快,並允許使用替代命名模式(可以根據其好壞來看)。 – Shelby115

+0

老實說,我認爲它確實不重要,除非您將此查詢確定爲造成性能問題的瓶頸。不過,我會建議不要過早地對數據庫進行非規範化(並添加一個額外的列,您手動填充已存在的數據),因爲它會造成管理和數據完整性的噩夢。 –

+0

是的,我正在/正在避免這種情況。我們最初在那裏有名稱字段,直到我注意到我們只是爲了這個目的而使用它,所以我刪除了它,然後我想我可能會做一個計算的。說實話,雖然它看起來並不重要,但我認爲最好的選擇可能只是讓它消失,並通過代碼而不是SQL使用其他數據。 – Shelby115

0

你可以做以下

SELECT 
    (SELECT count(*) FROM table1) as new_column_name, 
    col1, 
    col2 
FROM 
    table2 
1

有使計算列訪問另一臺以祕密的方式。

即創建一個用戶定義的函數來定義字段。 UDF可以訪問另一個表。

ALTER語句看起來類似:

ALTER TABLE dbo.FacilityDatabaseConnection 
    ADD Name AS udf_getFacilityName(FacilityId);