2017-08-14 152 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 ... 
相关问题