在第二个结果集

时间:2016-03-16 16:14:17

标签: sql sql-server select

我需要在第二个结果集中重用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的位置。我需要这些值来从另一个表中获取信息,以便我可以使用最终查询返回第二个结果集。该标志设置不到一半的结果。我可以:

  1. 检查客户端上的标志并分别查询第二组结果。
  2. 将上述查询粘贴到最终查询中,并将其调整为仅提取已标记的行。
  3. 在上面的查询顶部添加INSERT INTO #temp,这会阻止它返回结果集。然后我会SELECT * FROM #temp,然后在最终查询中加入#temp
  4. 例如,这是第三个选项的样子:

    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个放入变量中,或者我可以滥用任何内容以获得相同的效果?

2 个答案:

答案 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