sql内表替换

时间:2015-03-17 22:30:02

标签: sql oracle11g subquery

假设我有一个像以下一样的SQL查询(我意识到这个查询可以写得更好,只跟我一起):

SELECT aT.NAME 
FROM   anothertable aT, 
   ( SELECT ts.slot_id, 
                 tgm.trans_id,
                 tagm.agent_id 
          FROM   slots ts, 
                 transactions tgm, 
                 agents tagm 
          WHERE  ts.slot_id = (12345, 678910) 
          and    ts.slot_id = tagm.slot_id 
          AND    ts.slot_id = tgm.slot_id) INNER 
WHERE  INNER.trans_id = aT.trans_id
       AND INNER.agent_id = aT.trans_id

现在假设我需要将此查询分解为两个部分...在第一部分中我将执行内部查询,对代码中的结果执行一些处理,然后将简化集传递回外部部分的查询。问题是,有没有一种简单的方法来模拟sql中的内部表? 例如,如果内部查询的结果返回5行,但我的程序认为只需要其中的两行,那么如何编写将执行以下操作的sql?在sql中,是否有一种方法可以在查询使用中为内存声明一个表?

SELECT 
    at.Name
FROM
    anotherTable aT,
    (SLOT_ID, TRANS_ID, AGENT_ID
     -------------------------
    230743,  3270893,  2307203
    078490,   230897,   237021) inner
WHERE
   inner.trans_id = at.trans_id
   AND INNER.agent_id = aT.trans_id

3 个答案:

答案 0 :(得分:0)

大多数系统都允许您定义TEMP TABLE或TABLE VARIABLE:https://www.simple-talk.com/sql/t-sql-programming/temporary-tables-in-sql-server/

CREATE TABLE #temp ( 
  SLOT_ID INT,
  TRANS_ID INT,
  AGENT_ID INT
);

INSERT INTO #temp(SLOT_ID, TRANS_ID, AGENT_ID)
  (--inner query goes here)

--do your main query, then:

DROP TABLE #temp

在MS SQL Server中(不确定其他系统),您可以使用公用表表达式(CTE):https://technet.microsoft.com/en-us/library/ms190766%28v=sql.105%29.aspx

WITH inner AS (
  --inner query goes here
)

--main select goes here

就个人而言,由于我通常使用MSSQL Server,因此我可以使用CTE,因为它们可以“即时”创建,并且可以帮助组织更复杂的查询。

答案 1 :(得分:0)

只需使用子查询:

SELECT at.Name
FROM anotherTable aT JOIN
    (select 230743 as SLOT_ID,  3270893 as TRANS_ID,  2307203 as AGENT_ID from dual
     select 078490,   230897,   237021 from dual
    ) i
    on i.trans_id = at.trans_id AND i.agent_id = aT.trans_id;

答案 2 :(得分:0)

子查询方法有效。由于这是Oracle,语法结果是:

SELECT aT.Name
FROM anotherTable aT,
(select 1907945 as SLOT_ID, 2732985 as TRANS_ID, 40157 as AGENT_ID FROM DUAL 
   union
 select 1907945, 2732985, 40187 FROM DUAL 
) inner
WHERE
inner.trans_id = aT.trans_id AND INNER.agent_id = aT.trans_id;