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;
假设我有一个如下所示的 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;