Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server CTE代替光标_Sql Server_Common Table Expression - Fatal编程技术网

Sql server CTE代替光标

Sql server CTE代替光标,sql-server,common-table-expression,Sql Server,Common Table Expression,有人能给我举一个CTE用来单步遍历记录集而不是游标的例子吗 我找到的所有示例都显示递归。我不需要那个。我只想一次一个地浏览一个记录集 谢谢 (编辑) 也许最好换一种方式问这个问题。我认为CTE或游标可能是获取所需数据的最佳方式,但下面是一个示例 如果我有一个包含userid、代码和日期的表,如下所示,其中userid不是主键 2011-05-24 11:06:28.080 CODE1 199 2011-05-24 11:06:28.080 CODE2 199 2011

有人能给我举一个CTE用来单步遍历记录集而不是游标的例子吗

我找到的所有示例都显示递归。我不需要那个。我只想一次一个地浏览一个记录集

谢谢

(编辑)

也许最好换一种方式问这个问题。我认为CTE或游标可能是获取所需数据的最佳方式,但下面是一个示例

如果我有一个包含userid、代码和日期的表,如下所示,其中userid不是主键

2011-05-24 11:06:28.080 CODE1 199 2011-05-24 11:06:28.080 CODE2 199 2011-06-08 13:30:14.830 CODE2 209 2011-06-08 13:30:14.313 CODE1 209 2011-06-08 13:30:13.840 CODE2 209 2011-06-08 13:30:13.450 CODE1 209 2011-06-08 13:30:13.050 CODE2 209 2010-05-07 10:45:06.800 CODE3 79 2010-05-07 10:45:04.833 CODE3 79 2010-10-15 07:30:16.193 CODE3 79 2010-01-26 13:51:43.923 CODE3 79 2010-01-26 13:51:43.923 CODE3 79 2010-01-26 13:51:44.427 CODE3 79 2010-01-26 13:51:45.103 CODE3 79 2010-01-26 13:51:45.890 CODE3 79 2010-01-26 13:51:46.733 CODE3 79 2010-01-25 12:40:39.737 CODE3 81 2010-01-25 12:40:40.890 CODE3 81 2010-01-25 12:40:41.627 CODE3 81 2010-01-25 12:40:43.277 CODE3 81 2010-01-25 14:29:08.360 CODE3 81 2010-01-21 19:36:34.660 CODE3 98 2010-01-21 19:36:34.843 CODE3 98 2010-01-21 19:36:35.013 CODE3 98 2010-01-21 22:27:24.317 CODE3 83 2010-01-21 22:31:21.443 CODE2 83 2010-01-22 19:44:28.880 CODE3 83
谢谢,我保证以后在选择答案方面会做得更好

虽然这是一篇很老的文章,而且问题标题不适合说明您的主要任务,但最后是:我想从这个表中为每个用户选择最早的日期和代码。是否可以使用CTE执行此操作

with qry
(
SELECT Min(Date), userID
FROM TABLE
GROUP BY UserID
)

SELECT Table.*
FROM TABLE 
INNER JOIN qry on qry.UserID = Table.UserID AND qry.Date = Table.Date
答案是肯定的。你可以试试这个:

-- CTE version of the SQL
WITH CTE (OldestClaimData, CustomerID)
AS
(
  SELECT
    MIN(ClaimDate), CustomerID
  FROM
    UserClaims
  GROUP BY
    CustomerID
)
SELECT DISTINCT
  UC.*
FROM
  UserClaims UC
INNER JOIN
  CTE ON (
    CTE.OldestClaimData=UC.ClaimDate
    AND
    CTE.CustomerID=UC.CustomerID
    AND 
    UC.VenueCode=(
      SELECT TOP 1
        VenueCode
      FROM
        UserClaims sub
      WHERE
        sub.ClaimDate=UC.ClaimDate
        AND
        sub.CustomerID=UC.CustomerID
    )
)
ORDER BY
    UC.CustomerID;
为了您的方便,我把我的代码和您的代码放在了一个文件夹中


p.D.:使用您的

CTE不能替代游标。它们更像是临时表的替代品。例如,如果您需要在每次迭代中执行特定的代码,那么CTE将不会有多大帮助。为什么您需要一次“逐步完成”一个?为什么您认为任何类型的逐行操作(无论是否声明游标)的执行方式都与游标不同?减慢速度的是逐行部分,而不是声明游标部分。是的,请解释您的用例,我们可以为您指出解决方案。一旦您添加到VenueCode字段,您的解决方案就无法工作,Mitch。不过谢谢。那它不起作用呢?
选择表。*
行应返回该表中的所有列,包括代码列。。。
-- CTE version of the SQL
WITH CTE (OldestClaimData, CustomerID)
AS
(
  SELECT
    MIN(ClaimDate), CustomerID
  FROM
    UserClaims
  GROUP BY
    CustomerID
)
SELECT DISTINCT
  UC.*
FROM
  UserClaims UC
INNER JOIN
  CTE ON (
    CTE.OldestClaimData=UC.ClaimDate
    AND
    CTE.CustomerID=UC.CustomerID
    AND 
    UC.VenueCode=(
      SELECT TOP 1
        VenueCode
      FROM
        UserClaims sub
      WHERE
        sub.ClaimDate=UC.ClaimDate
        AND
        sub.CustomerID=UC.CustomerID
    )
)
ORDER BY
    UC.CustomerID;