【问题标题】:How to compare each string from first column with each string in second column in TSQL?如何将第一列中的每个字符串与 TSQL 中第二列中的每个字符串进行比较?
【发布时间】:2018-08-08 08:23:16
【问题描述】:

这是我试过的代码:

declare @o1 nvarchar(255)
declare @o2 nvarchar(255)

declare data cursor for
select o1.Name, o2.Name from MyDB.dbo.Table1 as o1, MyDB.dbo.MyTable2 as o2;

OPEN data;  

-- Perform the first fetch.  
FETCH NEXT FROM data into @o1, @o2;  

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.  
WHILE @@FETCH_STATUS = 0  
BEGIN  
   -- This is executed as long as the previous fetch succeeds.  

   FETCH NEXT FROM data INTO @o1, @o2;  
   Print 'Name1: ' + @o1

   WHILE @@FETCH_STATUS = 0  
    BEGIN  
       -- This is executed as long as the previous fetch succeeds.  

       FETCH NEXT FROM data INTO @o1, @o2;  
       Print 'Name2: ' + @o2
    END 
END  
CLOSE data;  
DEALLOCATE data;  
GO  

我的查询中有两列,都是 nvarchar(255)。 我想将第一列的每个值与第二列的每个值进行比较。这可以通过循环内的循环来实现,但我不知道我应该如何处理光标部分。

我应该放置一个变量并分别保持获取状态吗? 还是其他方法可以解决问题?

【问题讨论】:

  • 您能提供一些示例数据并期待结果吗?
  • 为什么要比较这两列?通过使用基于集合的查询,您可以在不使用游标的情况下比较它们。评论您的代码:您在Print 'Name1: ' + @o1 之前提取了两次,因此第一次提取的值丢失了。然后在使用@o2 之前再次获取,因此分配给@o2 的值(就在... 'Name1:' ... 上方)丢失了。然后你只在最后一次提取后消耗@o2,所以最后一次提取的@o1 也会丢失。此外,您用于光标的查询是笛卡尔积,因为您不以任何方式连接表。
  • 当你使用游标时,最好先declare你的游标,然后openfetch,启动你的while @@fetch_status循环,在while循环中写代码来消费获取的值, 在 while 循环、closedeallcoate 游标结束之前包含一个 fetch 语句。
  • 根据您的描述,您不必既不使用游标也不使用循环,只需简单的连接查询即可达到所需的结果。提供一些示例数据,以便我为您提供最终查询。
  • 这与您之前的问题有何不同?

标签: sql sql-server-2008 tsql


【解决方案1】:

我认为您不需要可以使用 select 的光标:

Select o1, O2
from table1
where o1 in (select o2 from table1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    相关资源
    最近更新 更多