【问题标题】:How to get values one by one from query result and Pass that as a parameter to another query and loop it如何从查询结果中逐个获取值并将其作为参数传递给另一个查询并循环它
【发布时间】:2023-04-04 12:44:01
【问题描述】:

我将从以下查询中获取值。然后我会创建一个循环。

select a FROM [tbl_outer] where col=1

使用上面的循环,我需要从下面的查询中获取值 (F.a = a)

select Distinct C.v, F.a
from tbl_main as F
    join tbl_inner1  as C on C.ID = F.ID and c.to = 0 
    join tbl_inner2 as E on E.a = F.a
    join tbl_inner3 as G on G.Id = E.Sales
where F.a = a
  and C.v NOT IN(select v from table_4
                 where Month = DATEPART(month, GETDATE())
                   AND Year = DATEPART(yyyy, GETDATE()))

我该怎么做?你能帮帮我吗?

【问题讨论】:

  • 这里的“循环”一词有点令人困惑。你的意思是你想要,对于你的第一个查询返回的每一行,从第二个查询中获取值?此外,在最终结果中,您是否希望获得第一个查询的所有行,即使第二个查询没有为它们返回任何内容(外连接)?或者,您是否只想保留第二个查询返回某些内容的值(内部联接)?
  • 是的,基于第一个查询的结果,我将该结果传递给第二个查询,执行第二个查询后需要转到第一个查询,然后从结果中选择第二行。我想要第二个查询返回的值
  • tbl_outertbl_innerX 是否在同一个数据库中?如果不是,数据库是否在同一台服务器上?
  • 是的,它们在同一个数据库中

标签: sql sql-server-2008 tsql


【解决方案1】:

假设这些表都在同一个数据库中,你可以试试这个(不幸的是我现在不能测试它,但我很确定它会起作用):

select T.cv, T.fa, a
FROM [tbl_outer] 
left outer join (
    select Distinct C.v as cv, F.a as fa
    from tbl_main as F
    join tbl_inner1 as C on C.ID = F.ID and c.to = 0 
    join tbl_inner2 as E on E.a = F.a
    join tbl_inner3 as G on G.Id = E.Sales
    where C.v NOT IN(select v from table_4
                     where Month = DATEPART(month, GETDATE())
                     AND Year = DATEPART(yyyy, GETDATE()))
) T on a = T.fa
where col=1

说明

  • 我使用了left outer join 来保留您的第一个查询返回的所有值。
  • 对于您的第一个查询返回的每一行,这将从您的第二个查询中获取数据。
  • 如果您的第二个查询没有为您的第一个查询的给定行返回任何内容,则相应的列值(即此处的 T.cvT.fa)将为 NULL
  • 我为您的第二个查询中的列使用了一些别名,以避免外部查询中列名的任何潜在混淆

这个查询肯定可以优化,但还是先确认一下正确性吧。

【讨论】:

    【解决方案2】:

    我只需添加一个额外的join 条件:

    select Distinct C.v, F.a
    from tbl_outer o join
         tbl_main f
         on f.a = o.a join
         tbl_inner1 C
         on C.ID = F.ID and c.to = 0 join
         tbl_inner2 E
         on E.a = F.a join
         tbl_inner3 G
         on G.Id = E.Sales
    where o.col = 1 and 
          C.v not in (select v
                      from table_4 t4
                      where t4.Month = month(getdate()) and t4.year = year(getdate())
                     );
    

    注意事项:

    • 这会将datepart() 替换为更易于理解的month()year() 函数。
    • 所有列名都是合格的。
    • 如果您想保留所有匹配的o.as,您可能需要left joins,即使是那些没有其他匹配值的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 2020-11-30
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多