首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 两个表联合查询的问题 [已结帖,结帖人:sisiz]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sisiz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-29 11:57:04 楼主

    select * from  dbo.f_split('aa,bb',',')
    select * from  f_split_Lg('1,2',',')
    select dicIncText,lgID  from dbo.f_split(@DicIncIDS,','),f_split_Lg(@LgID,',')
    为什么联合后显示四条记录

    aa 1
    bb 1
    aa 2
    bb 2

    我想要的结果是
    aa 1
    bb 2
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • libin_ftsafe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

    发表于:2008-08-29 11:58:511楼 得分:0
    因为两个表之间的联接没有条件,所以产生的是M x N的笛卡尔积。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zjcxc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      2

    发表于:2008-08-29 11:59:482楼 得分:0
    楼主的连接是 cross join, 是左边表记录数 * 右边表记录数, 所以结果当然是4条了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • roy_88
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      4

    发表于:2008-08-29 12:00:323楼 得分:0
    在兩個函數里新增一個自增列,通過自增列連接
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zjcxc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      2

    发表于:2008-08-29 12:00:424楼 得分:0
    建议改改你的函数, 加一个序号列, 这样你就可以用序号列来做联接了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wufeng4552
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 12:01:065楼 得分:30
    --1、用于查询重复处理记录(如果列没有大小关系时2000用生成自增列和临时表处理,SQL2005用row_number函数处理)

    --> --> (Roy)生成測試數據

    if not object_id('Tempdb..#T') is null
        drop table #T
    Go
    Create table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))
    Insert #T
    select 1,N'A',N'A1' union all
    select 2,N'A',N'A2' union all
    select 3,N'A',N'A3' union all
    select 4,N'B',N'B1' union all
    select 5,N'B',N'B2'
    Go


    --I、Name相同ID最小的记录(推荐用1,2,3),方法3在SQl05时,效率高于1、2
    方法1:
    Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID <a.ID)

    方法2:
    select a.* from #T a join (select min(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID

    方法3:
    select * from #T a where ID=(select min(ID) from #T where Name=a.Name)

    方法4:
    select a.* from #T a join #T b on a.Name=b.Name and a.ID>=b.ID group by a.ID,a.Name,a.Memo having count(1)=1

    方法5:
    select * from #T a group by ID,Name,Memo having ID=(select min(ID)from #T where Name=a.Name)

    方法6:
    select * from #T a where (select count(1) from #T where Name=a.Name and ID <a.ID)=0

    方法7:
    select * from #T a where ID=(select top 1 ID from #T where Name=a.name order by ID)

    方法8:
    select * from #T a where ID!>all(select ID from #T where Name=a.Name)

    方法9(注:ID为唯一时可用):
    select * from #T a where ID in(select min(ID) from #T group by Name)

    --SQL2005:

    方法10:
    select ID,Name,Memo from (select *,min(ID)over(partition by Name) as MinID from #T a)T where ID=MinID

    方法11:

    select ID,Name,Memo from (select *,row_number()over(partition by Name order by ID) as MinID from #T a)T where MinID=1

    生成结果:
    /*
    ID          Name Memo
    ----------- ---- ----
    1          A    A1
    4          B    B1

    (2 行受影响)
    */


    --II、Name相同ID最大的记录,与min相反:
    方法1:
    Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID>a.ID)

    方法2:
    select a.* from #T a join (select max(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID order by ID

    方法3:
    select * from #T a where ID=(select max(ID) from #T where Name=a.Name) order by ID

    方法4:
    select a.* from #T a join #T b on a.Name=b.Name and a.ID <=b.ID group by a.ID,a.Name,a.Memo having count(1)=1

    方法5:
    select * from #T a group by ID,Name,Memo having ID=(select max(ID)from #T where Name=a.Name)

    方法6:
    select * from #T a where (select count(1) from #T where Name=a.Name and ID>a.ID)=0

    方法7:
    select * from #T a where ID=(select top 1 ID from #T where Name=a.name order by ID desc)

    方法8:
    select * from #T a where ID! <all(select ID from #T where Name=a.Name)

    方法9(注:ID为唯一时可用):
    select * from #T a where ID in(select max(ID) from #T group by Name)

    --SQL2005:

    方法10:
    select ID,Name,Memo from (select *,max(ID)over(partition by Name) as MinID from #T a)T where ID=MinID

    方法11:
    select ID,Name,Memo from (select *,row_number()over(partition by Name order by ID desc) as MinID from #T a)T where MinID=1

    生成结果2:
    /*
    ID          Name Memo
    ----------- ---- ----
    3          A    A3
    5          B    B2

    (2 行受影响)
    */


    --2、删除重复记录有大小关系时,保留大或小其中一个记录


    --> --> (Roy)生成測試數據

    if not object_id('Tempdb..#T') is null
        drop table #T
    Go
    Create table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))
    Insert #T
    select 1,N'A',N'A1' union all
    select 2,N'A',N'A2' union all
    select 3,N'A',N'A3' union all
    select 4,N'B',N'B1' union all
    select 5,N'B',N'B2'
    Go

    --I、Name相同ID最小的记录(推荐用1,2,3),保留最小一条
    方法1:
    delete a from #T a where  exists(select 1 from #T where Name=a.Name and ID <a.ID)

    方法2:
    delete a  from #T a left join (select min(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID where b.Id is null

    方法3:
    delete a from #T a where ID not in (select min(ID) from #T where Name=a.Name)

    方法4(注:ID为唯一时可用):
    delete a from #T a where ID not in(select min(ID)from #T group by Name)

    方法5:
    delete a from #T a where (select count(1) from #T where Name=a.Name and ID <a.ID)>0

    方法6:
    delete a from #T a where ID <>(select top 1 ID from #T where Name=a.name order by ID)

    方法7:
    delete a from #T a where ID>any(select ID from #T where Name=a.Name)


    select * from #T

    生成结果:
    /*
    ID          Name Memo
    ----------- ---- ----
    1          A    A1
    4          B    B1

    (2 行受影响)
    */


    --II、Name相同ID保留最大的一条记录:

    方法1:
    delete a from #T a where  exists(select 1 from #T where Name=a.Name and ID>a.ID)

    方法2:
    delete a  from #T a left join (select max(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID where b.Id is null

    方法3:
    delete a from #T a where ID not in (select max(ID) from #T where Name=a.Name)

    方法4(注:ID为唯一时可用):
    delete a from #T a where ID not in(select max(ID)from #T group by Name)

    方法5:
    delete a from #T a where (select count(1) from #T where Name=a.Name and ID>a.ID)>0

    方法6:
    delete a from #T a where ID <>(select top 1 ID from #T where Name=a.name order by ID desc)

    方法7:
    delete a from #T a where ID <any(select ID from #T where Name=a.Name)


    select * from #T
    /*
    ID          Name Memo
    ----------- ---- ----
    3          A    A3
    5          B    B2

    (2 行受影响)
    */


    --3、删除重复记录没有大小关系时,处理重复值


    --> --> (Roy)生成測試數據

    if not object_id('Tempdb..#T') is null
        drop table #T
    Go
    Create table #T([Num] int,[Name] nvarchar(1))
    Insert #T
    select 1,N'A' union all
    select 1,N'A' union all
    select 1,N'A' union all
    select 2,N'B' union all
    select 2,N'B'
    Go

    方法1:
    if object_id('Tempdb..#') is not null
        drop table #
    Select distinct * into # from #T--排除重复记录结果集生成临时表#

    truncate table #T--清空表

    insert #T select * from #    --把临时表#插入到表#T中

    --查看结果
    select * from #T

    /*
    Num        Name
    ----------- ----
    1          A
    2          B

    (2 行受影响)
    */

    --重新执行测试数据后用方法2
    方法2:

    alter table #T add ID int identity--新增标识列
    go
    delete a from  #T a where  exists(select 1 from #T where Num=a.Num and Name=a.Name and ID>a.ID)--只保留一条记录
    go
    alter table #T drop column ID--删除标识列

    --查看结果
    select * from #T

    /*
    Num        Name
    ----------- ----
    1          A
    2          B

    (2 行受影响)

    */

    --重新执行测试数据后用方法3
    方法3:
    declare Roy_Cursor cursor local for
    select count(1)-1,Num,Name from #T group by Num,Name having count(1)>1
    declare @con int,@Num int,@Name nvarchar(1)
    open Roy_Cursor
    fetch next from Roy_Cursor into @con,@Num,@Name
    while @@Fetch_status=0
    begin
        set rowcount @con;
        delete #T where Num=@Num and Name=@Name
        set rowcount 0;
        fetch next from Roy_Cursor into @con,@Num,@Name
    end
    close Roy_Cursor
    deallocate Roy_Cursor

    --查看结果
    select * from #T
    /*
    Num        Name
    ----------- ----
    1          A
    2          B

    (2 行受影响)
    */
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Hero__008
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 18:22:066楼 得分:0
    最基础的数据库问题,建议看看书~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Bill_Mer
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 19:36:507楼 得分:0
    这个也叫问题~!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fcuandy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 19:38:118楼 得分:20
    from a,b 无 where a.x=b.y
    就是cross join

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • super1900
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-31 09:16:279楼 得分:0
    支持
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bing110
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-31 21:13:4210楼 得分:0
    呵呵,不错。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tjb8848
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-31 21:20:4711楼 得分:0
    呵呵,不错。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cacar2008
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-01 11:56:2112楼 得分:0
    yun
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • launix
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-01 15:56:2513楼 得分:0
    呵呵,要努力学习啊!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • CHLOVEQ
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-02 09:06:0914楼 得分:0
    楼主的是交叉联.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tgh518
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-02 12:42:0115楼 得分:0
    书到用时方很少啊。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fuyuxin19801120
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-02 16:48:5516楼 得分:0
    一楼的对
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • utpcb
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-02 16:56:0817楼 得分:0
    adsasdasdddddddddd
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xingsheng824
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-02 17:32:5618楼 得分:0
    散分贴???
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yan_276968183
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-03 11:39:0219楼 得分:0
    回贴请文明些```学习怎么能容许那样污秽的语言来侮辱呢```
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lhfdc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-03 18:33:3820楼 得分:0
    收藏
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zmx_susan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-04 14:22:3221楼 得分:0
    有了WHERE 查询条件就可以实现了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zmx_susan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-04 14:23:1422楼 得分:0
    有了WHERE 查询条件就可以实现了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • richnaly
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-08 16:16:1723楼 得分:0
    路过看看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hothot66
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-09 11:34:5624楼 得分:0
    支持5楼的关键就是加个where,你不设定条件程序怎么知道你要干什么。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved