用with子句替换临时表

时间:2018-03-13 23:37:08

标签: sql oracle with-clause

在DB#1中我通过将表A与表B连接来创建表tC,其中表B包含由来自不同DB#2(DB链接)的远程查询插入的值列表。

create table tC  
as  
(
select ta.col3, tb.col4  
from  
    tA, tB  
where  
     ta.col1 = tb.col2  

现在我需要在不使用表B且没有DB链接的情况下编写它,这意味着我需要将表B作为with子句,并将值作为输入。

  1. 从DB#2
  2. 中选择值数组
  3. 使用值与DB#1中的表A连接以创建表C
  4. 我正在使用脚本。假设我在内存中有值数组,如何创建带有值列表和列名的with子句并将其用于连接?

    类似的东西:

    with tB as (  
    5, 8, 14  
    2, 3, 17  
    10, 1, 15  
    ),  
    create table tC  
    as  
    select ta.col3, tb.col4  
    from  
        tB, tA  
    where  
         ta.col1 = tb.col2  
    

3 个答案:

答案 0 :(得分:2)

这样的事情可能就是你想要的:

create table tC as 
    with tB as (
          select 5 as col1, 8 as col2, 14 as col3 from dual union all
          select 2, 3, 17 from dual union all
          select 10, 1, 15
         ) 
    select ta.col3, tb.col3  
    from tB join
         tA  
         on ta.col1 = tb.col2 ;

根据您的示例数据,我不知道tb.col4可能指的是什么,因此我将其更改为tb.col3

在Oracle中,with附加到select,因此它位于create tableselect之间。

答案 1 :(得分:0)

在SQL Server中,您可以将其用作表格:

SELECT *
FROM
(
    VALUES
        (5, 8, 14),
        (2, 3, 17),
        (10, 1, 15)
) t (c1, c2, c3)

如果您的案例是在Oracle中,您可以检查是否存在类似的相似内容。

修改

我正在寻找并找到类似于Oracle的东西:

create type pseudo_table as table of number
\\
select * from table(pseudo_table(1,2,3)) t

希望它有所帮助。

答案 2 :(得分:0)

你想要这样吗?

WITH tbl1 AS (
    SELECT * FROM (
        VALUES
            (1, 4, 7),
            (2, 5, 8),
            (3, 6, 9)
    ) temp (c1, c2, c3)
),
tbl2 AS (
    SELECT * FROM (
        VALUES
            (1, 11, 12, 13),
            (2, 22, 23, 23),
            (3, 33, 34, 33)
    ) temp (c1, c2, c3, c4)
) Select tbl1.c3, tbl2.c4 FROM tbl1 JOIN tbl2 ON tbl1.c1 = tbl2.c1