我有一个奇怪的数据库架构(我无法改变),其中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语句中使用。
谢谢
答案 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
当然,如果列在详细信息表格中没有匹配,或者如果您有大量详细信息表格或者动态添加或删除它们,那么这一切都会崩溃。