假设我有一个像以下一样的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
答案 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;