2013-07-30 104 views
0

對不起,如果這是一個基本問題。我對SQL相當陌生,所以我想我只是錯過了要搜索的概念的名稱。如何構建虛擬列?

快速概覽。

第一個表(項目):

​​

二表(對):

ID  | FirstMember | SecondMember   Virtual column (pair name) 
------------------------------------- 
1  | 2    | 3     defghi 
2  | 1    | 4     abcjkl 

我試圖建立第二個表 它可以在內置顯示的虛擬列在第二個表中進行任何輸入的時間,但是如果這樣做,則在第一個表中的某個項目重新命名時,該列中的數據將會出錯。我也明白,我可以隨時建立該列(在普通請求或存儲過程中),但這會導致代碼重複,因爲第二個表可能涉及多個不同的請求。

那麼有沒有一種方法來定義一個「虛擬」列,可以作爲普通列訪問,但其內容是動態構建的?

謝謝。

編輯:這是在MsSql 2008上,但一個引擎不可知的解決方案將是首選。

編輯:上面的例子被多種方式過度簡化 - 主要的是虛擬列內容不是兩個名稱的直接連接,而是更復雜的事情,取決於我沒有描述的列的內容。儘管如此,你已經提供了多條看起來很有希望的路徑 - 我會回來的。謝謝。

+0

也許帶有觸發組件。 – obimod

+2

聽起來像是你想要一個觸發器......或一個視圖......或者只是一個查詢......我想這取決於你的用例:P – Charleh

+0

ooo好文章... https://en.wikipedia.org/wiki/View_(SQL) – obimod

回答

3

你需要加入的項目表兩次:

select p.id, 
     p.firstMember, 
     p.secondMember, 
     i1.name||i2.name as pair_name 
from pairs as p 
    join items as i1 on p.FirstMember = i1.id 
    join items as i2 on p.SecondMember = i2.id; 

然後把這個變成一個觀點,你有你的「虛擬列」。只需查詢視圖而不是實際的pairs表,無論您需要pair_name列。

請注意,上述內容使用內部連接,如果您的「FirstMember」和「SecondMember」列可能爲空,您可能希望使用外部連接。

+0

接受爲正確答案,因爲您是第一個建議使用視圖的人。我最終使用了一個視圖和一個標量函數(構建名稱) - 它的工作原理,但性能是不可接受的 - 但這是一個單獨的問題。謝謝。 – jmr

1

您可以使用view,它根據查詢結果(如提供了a_horse_with_no_name的查詢結果)創建一個類似於表的對象。

CREATE VIEW pair_names AS 
SELECT p.id, 
    p.firstMember, 
    p.secondMember, 
    CONCAT(i1.name, i2.name) AS pair_name 
FROM pairs AS p 
    JOIN items AS i1 ON p.FirstMember = i1.id 
    JOIN items AS i2 ON p.SecondMember = i2.id; 

然後查詢結果只是做:

SELECT id, pair_name FROM pair_names; 
0

您可以創建一個視圖爲您的 '虛擬列',如果你想,像這樣:

CREATE VIEW aView AS 

SELECT 
    p.ID, 
    p.FirstMember, 
    p.SecondMember, 
    a.name + b.name as 'PairName' 
FROM 
    pairs p 
LEFT JOIN 
    items a 
ON 
    p.FirstMember = a.ID 
LEFT JOIN 
    items b 
ON 
    p.SecondMember = b.ID 

編輯:

或者,當然,您可以每次只使用一個類似的選擇語句。

0

從表中選擇時,可以使用AS命名列的結果。

SELECT st.ID, st.FirstMember, st.SecondMember, ft1.Name + ft2.Name AS PairName 
FROM Second_Table st 
JOIN First_Table ft1 ON st.FirstMember = ft1.ID 
JOIN First_Table ft2 ON st.SecondMember = ft2.ID 

應該給你類似你之後的東西。