首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >根据另一个表的值选择表和字段

根据另一个表的值选择表和字段
EN

Stack Overflow用户
提问于 2015-07-09 20:23:11
回答 3查看 61关注 0票数 2

是否可以从表中连接和选择字段,其中表和字段名称以文本形式存储在另一个表中?

假设我有表TableofValues、TableA、TableB和TableC,如下所示。

是否可以在TableofValues中根据TableName在相关表中连接,然后选择基于FieldName的字段,其中TableRowID =连接表中的ID?

这是SQL Server 2008。

示例表格集:

预期结果:

EN

回答 3

Stack Overflow用户

发布于 2015-07-09 20:39:21

您也可以在没有动态查询的情况下实现这一点。请参阅以下代码:

代码语言:javascript
代码运行次数:0
运行
复制
-- Create Demo Data
CREATE TABLE #TableOfValues(id int identity(1,1), value float, TableName nvarchar(30), FieldName nvarchar(30), TableRowId int)

INSERT INTO #TableOfValues(value, TableName, FieldName, TableRowId)
VALUES  (1234.2,N'TableA',N'Customer',1),
        (245.5,N'TableB',N'Cust',3),
        (248.59,N'TableA',N'Customer',2),
        (8526.36,N'TableC',N'Cstmer',1),
        (224.15,N'TableB',N'Cust',5),
        (148.98,N'TableC',N'Cstmer',2)

CREATE TABLE #TableA(id int identity(1,1), Customer nvarchar(30))

INSERT INTO #TableA(Customer) 
VALUES(N'Bloggs'),(N'Smith'),(N'Jones')

CREATE TABLE #TableB(id int identity(1,1), Cust nvarchar(30))

INSERT INTO #TableB(Cust)
VALUES (N'Aother'),(N'NJONES'), (N'FBLOGGS'), (N'SMITH'), (N'BARTHUR')

CREATE TABLE #TableC(id int identity(1,1), Cstmer nvarchar(30))

INSERT INTO #TableC(Cstmer)
VALUES(N'Mr Fred Bloggs'),(N'Tony Smith')

-- Your Part
SELECT tov.id, tov.value, tov.TableName, tov.FieldName, tov.TableRowId, tabs.tabVal
FROM #TableOfValues as tov
INNER JOIN (
    SELECT N'TableA' as tabName, a.id, a.Customer as tabVal
    FROM #TableA as a
    UNION ALL
    SELECT N'TableB' as tabName, b.id, b.Cust as tabVal
    FROM #TableB as b
    UNION ALL
    SELECT N'TableC' as tabName, c.id, c.Cstmer as tabVal
    FROM #TableC as c
) as tabs
    ON tov.TableName = tabs.tabName
    AND tov.TableRowId = tabs.id

-- Cleanup
DROP TABLE #TableOfValues
DROP TABLE #TableA
DROP TABLE #TableB
DROP TABLE #TableC

如果需要,您可以向表中添加(如果它们不存在)索引。如果您寻找特定值,这些将进一步提高查询性能。

代码语言:javascript
代码运行次数:0
运行
复制
CREATE CLUSTERED INDEX [NCI_TableOfValues_id]
ON #TableOfValues ([id])

CREATE CLUSTERED INDEX [NCI_TableA_id]
ON #TableA ([id])

CREATE CLUSTERED INDEX [NCI_TableB_id]
ON #TableB ([id])

CREATE CLUSTERED INDEX [NCI_TableC_id]
ON #TableC ([id])

CREATE NONCLUSTERED INDEX [NCI_TableOfValues_TableName]
ON #TableOfValues([TableName])
INCLUDE ([id],[value],[FieldName],[TableRowId])

除了解决方案之外,表的设计也有些糟糕。它将进一步提高您的SELECT性能。

票数 1
EN

Stack Overflow用户

发布于 2015-07-09 20:37:39

除此之外,你应该有一个很好的理由这样做,因为它是非常糟糕的设计,否则,你可以考虑使用SchemaBinding视图。

您必须为任何给定的TableName创建一个视图。这可以在JOIN中使用

票数 0
EN

Stack Overflow用户

发布于 2015-07-09 20:53:41

您也可以这样做。您希望组合#TableA#TableB#TableC中的所有行,并添加一列以确定FieldName

代码语言:javascript
代码运行次数:0
运行
复制
SELECT
    Customer = FieldValue,
    Value = v.value
FROM #TableOfValues v
LEFT JOIN (
    SELECT id, Customer AS FieldValue, 'Customer' AS FieldName FROM #TableA UNION ALL
    SELECT id, Cust, 'Cust' FROM #TableB UNION ALL
    SELECT id, Cstmer, 'Cst' FROM #TableC
)t
    ON v.FieldName = t.FieldName
    AND v.TableRowId = t.id
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31317400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档