Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > [原创] 一个常见Sql问题的解决
【标  题】:[原创] 一个常见Sql问题的解决
【关键字】:Sql
【来  源】:http://blog.csdn.net/SysBug/archive/2006/11/29/1420050.aspx

[原创] 一个常见Sql问题的解决

Your Ad Here

一个常见Sql问题的解决

 

很多时候我们都需要实现如下的功能:

 

TableD

结构如下:

数据如下:

TableM

结构如下:


数据如下:

        

需要实现的功能如下:

     

具体的就不说了,大家仔细看了这几张图就知道实现什么了^-^

 

实现起来最直接方法就是用游标了,而且是嵌套游标,这个当然效率相当低了,不过随后会给出更好的实现方法^-^

 

这个方法需要建立一个临时表TableResult,它只有一个字段AllStr!!

 

SQL代码如下:

--方法一:嵌套游标

--表名            字段名

--TableD        AStr        BStr    CStr
--
TableM        AStr        BStr    
--
TableResult        AllStr

--符合条件的数据放到表TheSameRecord
Select     TableD.AStr,TableD.BStr,TableD.CStr 
Into     TheSameRecord 
From     TableM,TableD 
Where     TableM.AStr = TableD.AStr And TableM.BStr = TableD.BStr

Declare @AStr VarChar(50)
Declare @BStr VarChar(50)
Declare @CStr VarChar(50)

Declare @AllCStr VarChar(500)
Set @AllCStr = ''

Declare @iNext Bit
Set @iNext = 0


--外层游标
Declare Outer_Cursor Cursor For 
Select Distinct AStr,BStr From TheSameRecord

Open Outer_Cursor

Fetch Next From Outer_Cursor Into @AStr@BStr

While @@Fetch_Status = 0
Begin
    
--内层游标
    Declare Inner_Cursor Cursor For 
    
Select CStr From TheSameRecord Where AStr = @AStr And BStr = @BStr
    
    
Set @AllCStr = ''
    
    
Open Inner_Cursor
    
    
Fetch Next From Inner_Cursor Into @CStr
    
While @@Fetch_Status = 0
    
Begin
        
Set @AllCStr = @AllCStr + @CStr + ','
        
Fetch Next From Inner_Cursor Into @CStr
    
End

    
if (@iNext = 0)
    
Begin
        
Delete TableResult
        
Set @iNext = 1
    
End

    
Insert Into TableResult (AllStr) Values (SubString@AllCStr,1Len(@AllCStr)-1))
    
    
Print SubString@AllCStr,1Len(@AllCStr)-1 )

    
Close         Inner_Cursor
    
DealLocate     Inner_Cursor

    
Fetch Next From Outer_Cursor Into @AStr@BStr
End
Close         Outer_Cursor
DealLocate     Outer_Cursor


--删除表TheSameRecord
Drop Table TheSameRecord

Select * From TableResult

结果如下:

 

但是马上又想到了另外一种方法实现,因为函数本身就可以对数据进行循环,那么如果用函数来实现的话,
一则效率高,
二则代码量少
 
那么就有如下实现了:
--方法二:函数
Create Function AddStr(@AStr VarChar(50), @BStr VarChar(50))
Returns VarChar(8000)
As
Begin
    
Declare @ALLStr Varchar(8000)
    
Set @ALLStr=''

    
Select @ALLStr = @ALLStr + ',' + Cast(CStr As VarCharFrom TheSameRecord 
    
Where AStr  = @AStr And BStr = @BStr

    
Set @ALLStr = Right(@ALLStr,Len(@ALLStr)-1)
    
Return(@ALLStr)
End

Go

Select     TableD.AStr,TableD.BStr,TableD.CStr 
Into     TheSameRecord 
From     TableM,TableD 
Where     TableM.AStr = TableD.AStr And TableM.BStr = TableD.BStr

Go

Select Distinct AStr,BStr,dbo.AddStr(AStr,BStr) As AllStr From TheSameRecord

Drop Table TheSameRecord

结果如下:

oracle10g Enterprise Manager的修复:【上一篇】
SQL Server事务日志的处理方法:【下一篇】
【相关文章】
  • SQLSERVER海量数据库的查询优化及分页算法方案
  • Mysql中的select top
  • 回复“请教一条SQL语句”
  • SqlServer2000 DTS 向导 SP4,简体中文绿色版 (beta 1.0.0.1)
  • 破解SQL SERVER 加密存储过程,函数,触发器,视图
  • 查询SQL Server中表占用的空间方法
  • 为MySQL Connector Net连接MySQL使用正确的连接字符串
  • 透视MySQL数据库之更新语句
  • Sqlserver到底比Oracle差多少
  • 关于PostgreSQL的字符串
  • 【随机文章】
  • OpenCV常见问题及解决方法
  • IBM本本功能键介绍
  • 折叠分区
  • DW中的标签(mxi)
  • google talk真不错
  • ICMP地址掩码请求与应答
  • 工作流引擎采用jBPM3.1.2,引擎的流程定义、流程执行和流程监控等功能都经过验证
  • 博客中的rss有什么用?
  • KooMail 2.62 正式版发布
  • 如何在 Linux 上设置 FTP 服务
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.