2017-08-14 153 views
1

我有一個列ContentID在表中標識其他表中存在的內容。例如,它可能涉及pageID,productID等。我的計劃是使用它來獲取我需要的其他信息,例如頁面名稱或產品名稱。這是我到目前爲止有:如何從多個表中獲取一個字段的數據?

SELECT TL.ID, TL.TableName, TL.FileName, TL.ContentID, p.PageName AS Content 
FROM TranslationLog TL 
LEFT JOIN Pages P ON TL.ContentID = P.PageID 
LEFT JOIN Categories C ON TL.ContentID = C.CategoryID 
LEFT JOIN ProductDescriptions PD ON TL.ContentID = PD.SKU 

的想法是爲每一行,我想要得到的數據使用TableNameContentID領域指定的內容。目前,我可以通過選擇p.PageName AS Content來獲得PageName。但是,我想爲每個表格都做這件事。如果該行對應於pages表,則查詢該表 - 對於類別和產品描述是相同的。我還需要它具有別名「內容」,而不管我們正在使用的另一個表中的哪個字段,如PageNameProductName

可以做到這一點嗎?

編輯:

發表rd_nielsen的解決方案是近乎完美,但事實證明確實有一點與ContentID重疊。這是我結束了與解決它:

SELECT TL.ID, TL.TableName, TL.FileName, TL.ContentID, coalesce(P.PageName, C.CategoryName, PD.ProductName) 
FROM TranslationLog TL 
LEFT JOIN Pages P ON TL.ContentID = P.PageID AND TL.TableName = 'Pages' 
LEFT JOIN Categories C ON TL.ContentID = C.CategoryID AND TL.TableName = 'Categories' 
LEFT JOIN ProductDescriptions PD ON TL.ContentID = PD.SKU AND TL.TableName = 'Products' 
+0

我認爲樣本數據和預期的結果將真正幫助。 –

回答

1

如果TranslationLog.ContentID值只能在相關的表中的一個出現,那麼你可以從這些表合併值:

SELECT 
    TL.ID, 
    TL.TableName, 
    TL.FileName, 
    TL.ContentID, 
    coalesce(p.PageName, C.CategoryName, PD.ProductName) AS Content 
FROM 
    ... 
+0

是的,ContentID只能出現在其中一個表中 - 這是完美的,謝謝。 – Andy

2

你應該使用交叉應用。例如:

select 
    T.* 
from 
    table_stored_data u 
cross apply dbo.created_function(u.contentid,u.tablename,u.search_column) T 

您需要爲它編寫一個函數。

1

嘗試concat功能:

select concat(p.PageName, C.CategoryName, PD.ProductName) AS Content from ... 
相關問題