CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

一个比较另类的sql查询求解!

楼主jfq3d(秦时明月)2004-08-02 17:43:09 在 MS-SQL Server / 应用实例 提问

我有两个表   table1,table2  
   
  结构是  
  table1    
  CREATE   TABLE   [dbo].[TABLE1]   (  
  [n]   [int]   IDENTITY   (1,   1)   NOT   NULL   ,  
  [a]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NOT   NULL   ,  
  [b]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NOT   NULL   ,  
  [d]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NOT   NULL   ,  
  [e]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NOT   NULL    
  )   ON   [PRIMARY]  
   
  table2   结构  
  CREATE   TABLE   [dbo].[TABLE2]   (  
  [n]   [int]   IDENTITY   (1,   1)   NOT   NULL   ,  
  [a]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NULL   ,  
  [b]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NULL   ,  
  [o]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NULL   ,  
  [p]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NULL    
  )   ON   [PRIMARY]  
   
  数据库表内容  
  table1  
      a           b           d           e  
      ------------------------  
      a           b         45           58  
      a           b         26           48  
      a           b         15           23    
      aa         bb       25           26  
     
  table2    
      a           b           o           p        
  ----------------------------  
      a           b         df           ss  
      a           b         se           lp  
      aa         bb       dr           ger  
      aa         bb       der         df  
   
   
  现在我需要一个结果   结构内容是  
      a           b         d             e         o         p  
  ---------------------------------  
      a           b         45           58       df           ss  
      a           b         26           48       se           lp  
      a           b         15           23    
      aa         bb       25           26       dr         ger  
      aa         bb                               der         df  
     
   
  ---------------------------  
  也就是说,取a,b,两个公共自段,d,e,o,p   四个差异自段,组合一个新的结构,同时内容要求,是两个表内容的最小,如上,table1中,a=a,b=b的有三条记录,而table2中有两条记录,那么拼凑三条记录,table2中缺失的用空值代替。table1中a=aa,b=bb的有一条记录,table2中有两条,结果中就拼凑三条记录,table1中不够的就用空值代替。  
   
  你看明白了吗?谢谢你的参与  
   
  问题点数:20、回复次数:6Top

1 楼CSDMN(冒牌经理 V0.4)回复于 2004-08-02 17:49:26 得分 20

不是有id字段n吗?  
   
  select    
  isnull(a.a,b.a)   as   a,  
  isnull(a.b,b.b)   as   b,  
  a.d,a.e,b.o,b.p  
  from   table1   a   full   join   table2   b  
  on   a.a=b.a  
  and   a.b.b.b  
  and   (select   count(*)   from   table1   where   a=a.a   and   b=a.b   and   n<=a.n)=(select   count(*)   from   table2   where   a=b.a   and   b=b.b   and   n<=b.n)  
  Top

2 楼CSDMN(冒牌经理 V0.4)回复于 2004-08-02 17:55:50 得分 0

有点错误,修改和测试:  
   
  --建立环境  
  CREATE   TABLE   [dbo].[TABLE1]   (  
  [n]   [int]   IDENTITY   (1,   1)   NOT   NULL   ,  
  [a]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NOT   NULL   ,  
  [b]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NOT   NULL   ,  
  [d]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NOT   NULL   ,  
  [e]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NOT   NULL    
  )    
  go  
   
   
   
  CREATE   TABLE   [dbo].[TABLE2]   (  
  [n]   [int]   IDENTITY   (1,   1)   NOT   NULL   ,  
  [a]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NULL   ,  
  [b]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NULL   ,  
  [o]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NULL   ,  
  [p]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NULL    
  )    
  go  
   
   
  insert   table1(   a,     b,           d,           e)  
  select    
      'a',           'b',         '45',           '58'  
  union   all   select  
      'a'   ,         'b'   ,       '26'   ,         '48'  
  union   all   select  
      'a'     ,       'b'     ,     '15'     ,       '23'    
  union   all   select  
      'aa'     ,     'bb'     ,   '25'       ,     '26'  
  go  
   
  insert   table2   (     a   ,         b   ,         o   ,         p       )  
  select  
      'a',           'b',         'df',           'ss'  
  union   all   select  
      'a'   ,         'b'   ,       'se'   ,         'lp'  
  union   all   select  
      'aa'   ,       'bb'   ,     'dr'     ,       'ger'  
  union   all   select  
      'aa'     ,     'bb'     ,   'der'     ,     'df'  
   
  go  
   
  --查询  
  select    
  isnull(a.a,b.a)   as   a,  
  isnull(a.b,b.b)   as   b,  
  a.d,a.e,b.o,b.p  
  from   table1   a   full   join   table2   b  
  on   a.a=b.a  
  and   a.b=b.b  
  and   (select   count(*)   from   table1   where   a=a.a   and   b=a.b   and   n<=a.n)=(select   count(*)   from   table2   where   a=b.a   and   b=b.b   and   n<=b.n)  
   
  --结果  
  /*  
  a                     b                     d                     e                     o                     p                      
  ----------   ----------   ----------   ----------   ----------   ----------    
  a                     b                     45                   58                   df                   ss                  
  a                     b                     26                   48                   se                   lp                  
  a                     b                     15                   23                   NULL               NULL  
  aa                   bb                   25                   26                   dr                   ger                
  aa                   bb                   NULL               NULL               der                 df                  
   
  (所影响的行数为   5   行)  
   
  */  
  Top

3 楼jfq3d(秦时明月)回复于 2004-08-03 10:29:28 得分 0

谢谢楼上的回答,昨天我看了一半,社区竟然登录不上了,别的版面都能上!怪怪,你们也是这样吗?  
   
   
  不过,我提供的两个表结构有自动编号n主键,实际上这两个是查询出来的(select   来的   ),所以没有n的信息。如果这个样子不知怎么解决?Top

4 楼CSDMN(冒牌经理 V0.4)回复于 2004-08-03 11:51:55 得分 0

用临时表,产生序号,反正这个问题没有序号就必须用游标一个一个拼凑,速度更成问题  
  Top

5 楼CSDMN(冒牌经理 V0.4)回复于 2004-08-03 11:52:54 得分 0

你的表结构有  
  [n]   [int]   IDENTITY   (1,   1)   NOT   NULL   ,  
  不象自己写的,怎么说没有?  
   
  Top

6 楼jfq3d(秦时明月)回复于 2004-08-03 16:21:51 得分 0

呵呵,是我特意建立的表结构,然后复制到这里,为的是大家回答测试方便。因为我知道热心人会自己创建结构测试一下,所以我就先创建了Top

相关问题

  • 求解:sql查询问题!!
  • ---------------SQL高手请进,一个SQL查询的难题求解-------------
  • 新手求助 SQL简单查询语句求解
  • 高分求解一个SQL查询的问题
  • 50分求解一个SQL查询语句!
  • 50分求解一个SQL查询语句!
  • SQL 查询重复数据 在线等待,急求解答!!!!!!!!!
  • SQL求解!
  • sql求解
  • sql求解

关键词

  • 结构
  • null
  • prc
  • collate chinese
  • ci
  • df
  • aa
  • bb
  • table
  • char

得分解答快速导航

  • 帖主:jfq3d
  • CSDMN

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo