sql 内部 table 替换

sql inner table substitution

假设我有一个如下所示的 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 中模拟内部 table? 例如,如果内部查询的结果返回 5 行,但我的程序认为只需要其中两行,我该如何编写 sql 来完成我在下面尝试做的事情?有没有办法在 sql 中为查询使用的内存声明一个 table?

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

大多数系统会让您定义一个 TEMP TABLE 或 TABLE 变量: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 服务器中(不确定其他系统),您可以使用通用 Table 表达式 (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 的次数相当多,因为它们可以创建 "on the fly",并且对组织更复杂的查询有很大帮助。

只需使用子查询:

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;

子查询方法有效。由于这是 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;