【问题标题】:SQL Server - Reuse previous query - similar logic to LinqSQL Server - 重用以前的查询 - 类似于 Linq 的逻辑
【发布时间】:2016-12-06 11:22:28
【问题描述】:

我正在尝试编写实现以下查询的逻辑:

select ......
from (select ..... from ... complex and long query #1) R1
     (select ..... from ... complex and long query #2) R2
Where
  NOT ( @DateStart > R2.IstEnde OR @DateEnd <= R2.IstStart)
OR 
(
    (select count(*) 
     from R2  // <---- BUG IS HERE
     Where R2.IsOutsideTaskTimeFrame = 1 AND R2.IsManuallyFixed = 1
    ) > 0
)
order BY R2.PersonName, R1.YearOfWeek, R1.Week 

这显然不起作用,因为我试图在“count()”条件中“重用”R2。

我是根据“.NET Linq”逻辑编写的,我们可以“重用”之前的查询。

我什至可以编写这种“重用”前一个查询而不重复它的逻辑吗?

【问题讨论】:

  • 我对此并不完全确定,但“重用”不是 sql View 概念的另一个词吗?
  • 你打算如何加入 R1 和 R2 那里?目前他们没有连接,或者如果他们之间有逗号,那么一个 CROSS JOIN(所有行到所有行)

标签: c# sql-server linq


【解决方案1】:

也许你正在寻找CTE - Common Table Expression

;WITH R1 AS
(SELECT ...)
,R2 AS
(SELECT ...)
SELECT * FROM R1
... use R1 and R2 like any other table here (it's called "derived table")

如果您需要独立查询中的结果,您可以填写声明的表变量或临时表。

【讨论】:

    【解决方案2】:

    您可以使用 CTE 定义一个可以在同一代码范围内多次使用的基本查询:

    WITH Sales_CTE (returnParam1, returnParam2, ...)
    AS
    -- Define the CTE query.
    (
        select ..... from ... complex and long query #2 
    )     
    

    或者你可以创建一个用户定义的函数来获取参数并返回结果,然后多次调用它:

    CREATE FUNCTION dbo.ufnGetInventoryStock(param1 int, ...)  
    RETURNS int   
    AS    
    RETURN ( 
        select ..... from ... complex and long query #2  
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多