【问题标题】:Is there a way to loop through recordset and identify different values?有没有办法遍历记录集并识别不同的值?
【发布时间】:2023-04-03 12:49:01
【问题描述】:

我有一个 MS SQL 存储过程,它使用游标循环选择语句的记录。当我循环读取每条记录时,它可能是 3,然后是 3,然后是 3,或者可能是 3,然后是 4,然后是 5,然后是 3。它可能是一条记录,也可能是多条记录。

我需要知道的是所有值都相同还是不同?我不在乎它们是什么,只要它们相同或不同。如果我使用客户端代码执行此操作,我将使用一个列表并查看该值是否在列表中,然后当我完成后,我会计算这些值,如果一个则相同,如果大于 1,则不同。

       DECLARE TC CURSOR LOCAL
             FOR SELECT ProgramID FROM tblPublications
              OPEN TC
              FETCH NEXT FROM TC INTO @ProgramID
              WHILE @@FETCH_STATUS = 0
              BEGIN
              Print @ProgramID
               --Same or Different then the last one???


              FETCH NEXT FROM TC2 INTO @ProgramID
              END
              CLOSE TC
              DEALLOCATE TC
        END

如果它们相同,我将以一种方式更新记录,如果它们不同,则以另一种方式更新状态记录。

谢谢

【问题讨论】:

  • 可能有更好的方法可以在没有循环或游标的情况下完成您正在做的事情。你会扩展你的问题吗?
  • 我们不想在sql中计算值时使用循环。我们使用聚合来代替。像 count(YourValue) 这样的东西。给我们一些关于数据和所需输出的实际细节,我们可以提供帮助。这是一个很好的起点。 spaghettidba.com/2015/04/24/…
  • 我有一份属于各个部门作者的出版物列表。如果所有作者都来自同一部门,则该出版物被视为 INTRA 部门,如果多个部门参与了该出版物的编写,则该出版物被视为 INTER 部门。我的记录集包含基于 PublicationID 的部门/programid so-- SELECT ProgramID where PublicationID = 12345- 现在我需要查看 ProgramID 是相同还是不同

标签: sql-server stored-procedures cursor


【解决方案1】:

可能是这样的(不涉及光标)?

select PubId, count(distinct ProgId) 
from tblPublications
group by PubId

【讨论】:

    【解决方案2】:

    您可以使用 count(distinct col) 获取列的不同值的数量,并使用 case 表达式返回一个值,具体取决于它是 1 还是更多。

    select 
        PublicationId
      , PublicationType = case 
          when count(distinct ProgramId) > 1 
            then 'inter' 
          else 'intra' 
          end
    from  tblPublications
    where PublicationId = 12345
    group by PublicationId
    

    【讨论】:

    • 你和 Giorgos 都很棒——很难说出正确的答案
    • @user1314159 乐于助人!
    • 感谢您的回复,保重!
    【解决方案3】:

    您可以比较组中 ProgramID 的最小值和最大值。 如果所有值都相同,则最大值将与最小值相同。

    ;with tblPublications(ProgramID,ID)AS(
    select 'a',1 union 
    select 'b',1 union
    select 'c',2 union
    select 'c',2
    

    )

    select case when ISNULL(max(ProgramID),'')=ISNULL(min(ProgramID),'') then 'Same' else 'Different' end   
    from tblPublications
    group by ID
    
    (无列名) 1 不同 2 相同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      相关资源
      最近更新 更多