【问题标题】:Oracle Query - Selecting records using column data from first tableOracle Query - 使用第一个表中的列数据选择记录
【发布时间】:2014-02-28 15:06:33
【问题描述】:

使用 Oracle,我有需要查询的表。有一个主表,其中包含一个包含所有其他表的名称的字段。 (每行一个)

第一个表 (table1) 有一列包含第二个表 (table1.table2name) 的表名。

第二个表有一个日期字段(datetocheck)。如果第二个表中没有超过 6 个月的记录,我只想从第一个表中带回记录(table2 有日期,table1 有我要显示的数据)。

应该是这样的格式:

select * from table1 
where not exists (
                  select * from table1.table2name
                  where datetocheck > add_months(sysdate, -6)
                 )

提前致谢

其他信息

有一个 table1 和 MANY table2。

例如

主表(table1)

记录 1:column:table2name='Table2a'

记录 2:column:table2name='Table2b'

记录 3:column:table2name='Table2c'

附加表(table2x)

---表2a

记录 1:column:datetocheck='01/01/1980'

记录 2:column:datetocheck='01/01/1990'

记录 3:column:datetocheck='01/01/2000'

---表2b

记录 1:column:datetocheck='01/01/1982'

记录 2:column:datetocheck='01/01/1983'..etc

---表2c

记录 1:column:datetocheck='01/01/2014'

记录 2:column:datetocheck='02/01/2014'..etc

注意 #1:table1 和 table2x 之间的唯一关系是 table1 中的 table2name 列和 table2x 中的实际表名。

【问题讨论】:

标签: sql oracle


【解决方案1】:

您可以使用DBMS_XMLGEN 在查询中创建动态 sql:

select *
from table1 as t1
where dbms_xmlgen.getxmltype('select * from ' || 
                             t1.table2name ||
                             ' where datetocheck > add_months(sysdate, -6)
').extract('//text()').getstringval() is not null

Here is a sqlfiddle demo

【讨论】:

  • A.B.凯德,谢谢你,你绝对是在正确的轨道上。一个简单的问题,如果 table2name 在 table1 的一个字段中,我将如何提取它?谢谢。
  • 我不明白您的问题,我将答案编辑为 table1 的别名为 t1,因此您可以看到我使用 t1.table2name 提取了值
  • 试过你的例子,效果很好。哇,恭喜,谢谢。标记为答案。
  • A.B.凯德,你知道是否有一种简单的方法可以检查 table2x 是否存在?我收到错误消息,因为某些表位于 table1 行中,但表 (table2x) 不存在。
  • 有一个想法 - 将 table1user_tables 连接起来,这样只会查询现有表,但不幸的是,您无法确定 where 子句的哪一部分将首先被评估...无论如何,找到了一种方法来做到这一点(我认为)但它很丑陋。请参阅new demo
猜你喜欢
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多