SQL在select语句中创建临时“映射”表

时间:2009-03-25 16:25:35

标签: sql oracle

我正在通过加入表来构建结果

select t1.*, t2.col2 from t1, t2 where t1.col1=t2.col1

有没有办法在select语句中为t2表不存在的实例创建临时'mapping'表'inline'?

类似

select t1.*, tempt2.col2 from t1, (<create temp table>) tempt2 where ...

我正在使用Oracle

5 个答案:

答案 0 :(得分:3)

1行的表格:

SELECT t1.*, t2.col2
FROM   t1,
       (
       SELECT  1 AS col2
       FROM    dual
       ) t2

包含0行的表格:

SELECT t1.*, t2.col2
FROM   t1,
       (
       SELECT  1 AS col2
       FROM    dual
       WHERE   1 = 0
       ) t2

包含N行的表格:

SELECT t1.*, t2.col2
FROM   t1,
       (
       SELECT  1 AS col2
       FROM    dual
       CONNECT BY
               level <= :N
       ) t2

答案 1 :(得分:2)

我不确定这是你在找什么,但你可以用UNION做多个SELECT来获得派生表

SELECT t1.*, t2.col2
FROM t1, (
    SELECT 1 as Id, 'Foo' as Col2
    UNION ALL
    SELECT 2 as Id, 'Bar' as Col2
    UNION ALL
    SELECT 3 as Id, 'FooBar' as Col2
) t2
WHERE
   t1.Id = t2.Id

答案 2 :(得分:2)

我知道这个问题很老了。但只是为了完成答案,那么DECODE()函数呢?

https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions040.htm#i1017437

SELECT product_id,
   DECODE (warehouse_id, 1, 'Southlake', 
                         2, 'San Francisco', 
                         3, 'New Jersey', 
                         4, 'Seattle',
                            'Non domestic') 
   "Location of inventory" FROM inventories
   WHERE product_id < 1775;

只要映射表相当短,这似乎是一个非常优雅的解决方案。

答案 3 :(得分:0)

不知道它是否适用于Oracle,但您是否正在寻找类似下面的伪代码?

从t1内连接中选择t1。*,tempt2.col2(从t2中选择col2,foo,bar,其中bar =?)tempt2 on t1.foo = tempt2.foo where。 。

我想这并没有真正解决问题,因为你说table2(t2)并不存在。我不确定你在映射表中有什么,或者如果不是从表中获取数据的话。

答案 4 :(得分:0)

我不完全确定你在这里得到什么。

你想要的是WITH clause例如

WITH tempt2 AS 
  (SELECT x FROM y)
SELECT t1.*, tempt2.col2
FROM t1, tempt2
WHERE ...

否则,如果您在不同的数据库上运行相同的SQL并且无法确定该表是否确实存在,那么您可能更好地测试其存在并做出不同的反应。

是否需要纯SQL或者您是否可以使用PL / SQL?