我需要在第二个结果集中重用SELECT
的一小部分结果。我有一个标准选择:
SELECT
o.id,
r.my_flag,
c.*
FROM original o
INNER JOIN registry r ON o.id = r.id
LEFT JOIN content c ON o.id = c.id
--etc.
我需要它继续在第一个结果集中返回所有结果。
但我也想要此集合中的o.id
列值,就在列r.my_flag = 1
的位置。我需要这些值来从另一个表中获取信息,以便我可以使用最终查询返回第二个结果集。该标志设置不到一半的结果。我可以:
INSERT INTO #temp
,这会阻止它返回结果集。然后我会SELECT * FROM #temp
,然后在最终查询中加入#temp
。例如,这是第三个选项的样子:
INSERT INTO #temp
--above select here
SELECT * FROM #temp -- this returns exactly the original resultset
-- but now I can now return a second resultset:
SELECT
t.id,
s.*
FROM #temp t
INNER JOIN special s
WHERE
t.my_flag = 1
我已尝试过这些选项,而且速度很慢。这可能是不可避免的。但似乎应该有另一种选择:在原始选择期间有条件地将id
收集到变量中 - 类似于OUTPUT INTO
子句,但它与SELECT
一起使用。
是否有任何内容可以将第一个查询(id
)中的x.my_flag = 1
个放入变量中,或者我可以滥用任何内容以获得相同的效果?
答案 0 :(得分:1)
一个查询并在客户端解析结果?
select orig.*, more.*
from orig
left outer join more
on more.id = orig.id
and orig.flag = 1
order by orig.id
OP说明更多。不是唯一的
如果orig.id是唯一的或者只有orig的唯一组合,那么您仍然可以在客户端上解析并在一个查询中执行此操作
这里的实际问题是什么?什么部分花时间?我们可能处于XY中,您可以获得感知解决方案,并且可以更好地解决实际问题。
很难为您提供有限的信息。这是最后一次尝试。
INSERT INTO #temp
SELECT o.id, r.my_flag
FROM original o
INNER JOIN registry r ON o.id = r.id
ORDER BY (o.id) -- please tell me you have PK on #temp
SELECT *
FROM #temp
LEFT JOIN content c ON #temp.id = c.id
-- but now I can now return a second resultset:
SELECT t.id, s.*
FROM #temp t
INNER JOIN special s
-- please tell me this has an on clause
WHERE
t.my_flag = 1
答案 1 :(得分:0)
我建议您尝试SELECT * INTO #tmp FROM original x WHERE x.my_flag = 1
,然后{\ n} CREATE INDEX
在您将用于加入的列上。如果您使用ID列加入,则可以执行CREATE CLUSTERED INDEX
。