Oracle-动态连接一个或多个内联表

时间:2019-05-31 21:03:47

标签: sql oracle

我遇到一个问题,其中验证代码与其他数据一起存储在我的表中。不幸的是,描述存储在一个我无法访问的表中。我确实知道值

示例

enter image description here

12、14和22-在excel中可以找到它们的说明。我无权创建用于存储数据的表,因此我每天都需要运行它们作为报告工作。

  • 12-缺少工作
  • 14-缺席
  • 22-不完整

问题:如何编写一个查询,可以使用excel中的值创建一个虚拟表(内联?即时运行?)并联接到我的表中,以便结果看起来像这样

enter image description here

注意:

  • 我无法创建烫发表-没有权限。对我来说是只读的Db
  • 我想在查询中提供12,MissingWork,14,缺席

任何想法。我尝试搜寻。我认为我没有使用正确的术语,因此找不到结果。

4 个答案:

答案 0 :(得分:1)

您可以通过加入一个SELECT FROM dual每个代码描述对UNION ALL并使用SELECT t1.date, t1.task, t1.code, x.description FROM table1 t1 LEFT JOIN (SELECT 12 code, 'Missing Work' description FROM dual UNION ALL SELECT 14 code, 'Absent' description FROM dual ...) x ON x.code = t1.code; 将其结果组合为一组的子查询来实现。

excel

答案 1 :(得分:1)

如您所知,这些代码和说明很简单,就是创建一个CTE。在下面的示例中,它称为table1。此示例中的另一个CTE代表您的“真实” SQL> with excel (code, description) as 2 (select 12, 'Missing Work' from dual union all 3 select 14, 'Absent' from dual union all 4 select 22, 'Incomplete' from dual 5 ), 6 table1 (c_date, task, code) as 7 (select date '2019-05-30', 'Homework', 12 from dual union all 8 select date '2019-05-31', 'Labwork' , 14 from dual union all 9 select date '2019-05-30', 'Other' , 22 from dual 10 ) 11 select t.c_date, t.task, t.code, e.description 12 from table1 t join excel e on e.code = t.code; C_DATE TASK CODE DESCRIPTION ---------- -------- ---------- ------------ 05/30/2019 Homework 12 Missing Work 05/31/2019 Labwork 14 Absent 05/30/2019 Other 22 Incomplete SQL> (我可以在数据库中创建它,但是CTE足以显示要做什么)。

<xsl:template match="Subject">
  <Subject_xref><xsl:value-of select="@xref"/></Subject_xref>
</xsl:template>

答案 2 :(得分:1)

您可以使用称为通用表表达式(CTE)的东西

WITH Code_lookup AS (
  SELECT 12 Code, 'Missing Work' Description FROM DUAL UNION ALL
  SELECT 14, 'Absent' FROM DUAL UNION ALL
  SELECT 22, 'Incomplete' FROM DUAL)
SELECT <your columns list>
  FROM <your table>
  JOIN Code_lookup USING (Code)

答案 3 :(得分:0)

也许使用带有联合的公共表表达式:

Dim MyOptions As New Dictionary(Of String, String) From {{"one", "ONE"}, {"two", "TWO"}, {"three", "THREE"}}