当表格的名称位于第一个表格的列数据

时间:2016-09-06 14:37:27

标签: sql oracle

我有一个奇怪的数据库架构(我无法改变),其中TableA中的行将包含一个表名,其中存储了更多信息。我想查询TableA中的数据,并使用查询行中表中包含的扩展值将它们连接起来。

e.g。假设我有以下数据

TableA
Event ID     Accnt ID    DetailTable
-----------  ----------  ----------------
1            UserA       Table1
2            UserA       Table2
3            UserB       Table2

Table1
Accnt ID    Status
----------  ------------
UserA       Active

Table2
Accnt ID    Status
----------  ------------
UserA       Inactive
UserB       Active

我想得到以下结果

select ... from ...

Result
Accnt ID   DetailTable    Status
---------  -------------  ---------
UserA      Table1         Active
UserA      Table2         Inactive
UserB      Table2         Active

可以在TableA的每个记录上使用循环来完成,然后查询正确的详细信息表,但我想知道它是否可以在Oracle SQL中的单个Select语句中使用。

谢谢

1 个答案:

答案 0 :(得分:2)

这可能是一个普遍的问题,有人会避免使用EAV反模式并跳转到相反的反模式,即为存储在" main"中的每种类型的对象动态生成细节表。表。当您发现自己将表或字段名称存储为数据时,可能需要重新考虑您的架构。但是,就像EAV一样,有时这是不可避免的。

如果您知道可能出现在DetailTable列中的表名,那么您可以有条件地加入这些表名,或者使用UNION查询(假设列在您的详细信息表中很好地匹配):

SELECT
    TableA.AccntID,
    unionDetail.DetailTable,
    unionDetail.Status
FROM
    TableA
    INNER JOIN 
        (
            SELECT AccntID, Status, 'Table1' as DetailTable FROM Table1
            UNION ALL
            SELECT AccntID, Status, 'Table2' FROM Table2        
        ) AS unionDetail ON
        TableA.AccntID = unionDetail.AccntID AND
        TableA.DetailTable = unionDetail.DetailTable

当然,如果列在详细信息表格中没有匹配,或者如果您有大量详细信息表格或者动态添加或删除它们,那么这一切都会崩溃。