2012-01-06 26 views
4

我有一個表tbl_Info如何動態地決定在SQL Server存儲過程加入哪些表

InfoId 
Text 
PrivacyTypeId 
UserName 
TypeId 
IsInfo 
InfoItemId 

數據示例:

1|Some text...|1|userX|1|False|NULL 
2|New job created|1|system|3|True|765 
3|Image commented|1|system|4|True|457 

在我的應用我從這個表中的所有值我將它們顯示爲一個列表。

應用程序用戶可以點擊這些項目中的每一個,並且它們應該被重定向到應用程序的某個地方。

我有一些數據庫中的表綁定到這個表,但是這個連接是非常動態的。例如,這表:

tbl_Jobs{JobId, Title etc.}, tbl_Articles{ArticleId, Title etc.} 

這裏的問題是:
之前,我加入IsInfoInfoItemId我只有一個類型,用戶進入該相關信息和所有我需要的是讓信息欄+用戶全名:

select i.*, p.FirstName + ' ' + p.LastName as Author 
from tbl_Info i 
left join tbl_Profiles p on i.UserName = p.UserName 
where i.PrivacyTypeId = 1 

現在我需要改變這個Author柱,Title名和這個值應該是:全名或職位或文章標題等

我不知道是否可以做出選擇程序,以便它可以基於IsInfoTypeId從ID爲InfoItemId的另一個表中獲得項目標題。

所以像這樣:如果IsInfo = True。獲取typeId。並基於此類型ID加入某個表並從中獲取一些列。

IF typeId = 2 ... join tbl_Jobs on ... 
IF typeId = 3 ... join tbl_Articles on ... 

對不起,我稍微抱歉。但是我找不到解決方案,我需要更詳細地解釋問題。

+3

爲什麼你用'tbl_'加前綴?一切都是一張桌子,所以在它前面加上無用的噪音。它還可以提供更好的維護(如果DBA決定用新表替換其中一個表,比如說)。所有我需要知道的是,如果我問一個給定的數據結構,它以適當的格式的一組數據的迴應 - 我不應該需要關心數據結構是如何設置。 – 2012-01-06 21:17:32

+1

我曾在一家公司,這是命名約定。這是在我的血液裏2年。但你是對的,它不會改變它:) – 1110 2012-01-06 21:39:42

回答

10

你可以做這樣的事情:

SELECT 
CASE typeID 
    WHEN 1 THEN tbl_Profiles.FirstName + ' ' + tbl_Profiles.LastName 
    WHEN 2 THEN ... 
    WHEN 3 THEN ... 
END AS Title 
FROM tbl_Info 
LEFT OUTER JOIN tbl_Profiles ON 
    tbl_Info.UserName = tbl_Profiles.UserName 
    AND typeID = 1 
LEFT OUTER JOIN tbl_Jobs ON 
    .... 
    AND typeID = 2 
LEFT OUTER JOIN tbl_Articles ON 
    .... 
    AND typeID = 3 
+0

我只是不能表達我對這段代碼的感謝:)這解決了我的問題在這裏。謝謝 – 1110 2012-01-06 21:36:44

+0

不客氣。很高興我能幫上忙! – 2012-01-06 22:09:52

2

這是可能的,我錯過了第一次檢查然而一些這樣看來,你能滿足您的需要使用簡單的if語句有一個給定存儲過程中的兩個代碼路徑。

IF (ConditionIsTrue) 
BEGIN 
     -- First form of select statement 
END 
ELSE 
BEGIN 
    -- Second form of select statement 
END 
2

如果你需要在一個大的列表中顯示的數據,你可以使用一個聯盟綁在一起:

SELECT i.*, p.FirstName + ' ' + p.LastName as Author 
    FROM tbl_Info i 
    INNER JOIN tbl_Profiles p ON i.UserName = p.UserName 
    WHERE i.PrivacyTypeID=1 
UNION ALL 
SELECT i.*, j.Title 
    FROM tbl_Info i 
    INNER JOIN tbl_Jobs j ON ... 
    WHERE i.PrivacyTypeID=2 
... 

否則,如果你真的只是想在一個時間顯示不同的東西(即只是輪廓,只是工作等,然後用約翰·桑塞姆的答案去,與IF語句

其包裝
相關問題