CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  非技术版

请问一个简单的sql语句

楼主yinhuiling(YHL)2006-03-04 15:58:25 在 MS-SQL Server / 非技术版 提问

我有两个表,Table1(parentKey,subKey),Table2(Key,   startTime,   endTime   ...)  
  第二个表我只知道有一列名为Key,我想基于这两个表创建一个view,把这两个表做一个join,条件是Table1.subKey   =   Table2.key,创建的view包括Table1的parentKey和Table2的除Key以外的其他列,且把parentKey列改名为Key,也就是说创建的View和Table2的列相同,这个sql语句应该怎么写?谢谢大侠 问题点数:100、回复次数:4Top

1 楼wgsasd311(自强不息)回复于 2006-03-04 16:11:42 得分 0

declare   @sql   varchar(4000)  
  set   @sql='select   a.parentkey   '  
  select   @sql=@sql+',b.'+name   from   syscolumns   where   id=object_id('table2')  
  set   @sql=replace(@sql,',b.key','')  
  set   @sql=@sql+   '   from   table1   a,   table2   b    
  where   a.subKey   =   b.key   '  
  exec('create   view   v_1   as   '+@sql)Top

2 楼zbxubing(冰)回复于 2006-03-04 16:39:11 得分 0

使用内联接  
  内联接是用比较运算符比较要联接列的值的联接。  
   
  在   SQL-92   标准中,内联接可在   FROM   或   WHERE   子句中指定。这是   WHERE   子句中唯一一种   SQL-92   支持的联接类型。WHERE   子句中指定的内联接称为旧式内联接。  
   
  下面的   Transact-SQL   查询是内联接的一个示例:  
   
  USE   pubs  
  SELECT   *  
  FROM   authors   AS   a   INNER   JOIN   publishers   AS   p  
        ON   a.city   =   p.city  
  ORDER   BY   a.au_lname   DESC  
   
  此内联接称为相等联接。它返回两个表中的所有列,但只返回在联接列中具有相等值的行。  
   
  下面是结果集:  
   
  au_id                 au_lname     au_fname   phone                   address                     city          
  -----------     --------     --------   ------------     ---------------     --------  
  238-95-7766     Carson         Cheryl       415   548-7723     589   Darwin   Ln.         Berkeley  
  409-56-7008     Bennet         Abraham     415   658-9932     6223   Bateman   St.     Berkeley  
   
  state   zip       contract   pub_id   pub_name                             city           state   country  
  -----   -----   --------   ------   ---------------------   --------   -----   -------  
  CA         94705   1                 1389       Algodata   Infosystems     Berkeley   CA         USA          
  CA         94705   1                 1389       Algodata   Infosystems     Berkeley   CA         USA          
   
  (2   row(s)   affected)  
   
  在结果集中,city   列出现两次。由于重复相同的信息没有意义,因此可以通过更改选择列表消除两个相同列中的一个。其结果称为自然联接。可以重新表述前面的   Transact-SQL   查询以形成自然联接。例如:  
   
  USE   pubs  
  SELECT   p.pub_id,   p.pub_name,   p.state,   a.*  
  FROM   publishers   p   INNER   JOIN   authors   a  
        ON   p.city   =   a.city  
  ORDER   BY   a.au_lname   ASC,   a.au_fname   ASC  
   
  下面是结果集:  
   
  pub_id   pub_name                             state         au_id                 au_lname     au_fname  
  ------   ---------------               --------   -----------     --------     --------   1389       Algodata   Infosystems     CA               409-56-7008     Bennet         Abraham  
  1389       Algodata   Infosystems     CA               238-95-7766     Carson         Cheryl  
   
  phone                   address                     city             state   zip       contract  
  ---------------     -------------   --------     -----   -----   ---------  
  415   658-9932     6223   Bateman   St.   Berkeley     CA         94705   1  
  415   548-7723     589   Darwin   Ln.       Berkeley     CA         94705   1  
   
  (2   row(s)   affected)  
   
  本示例中,publishers.city   没有出现在结果中。  
   
  使用等号以外的运算符的联接  
  也可以联接两个不相等的列中的值。用于内联接的运算符和谓词同样也可用于不相等联接。有关联接中可用的运算符和谓词的更多信息,请参见在表达式中使用运算符和   WHERE。    
   
  下面的   Transact-SQL   示例是一个大于   (>)   联接,可用于查找住在   Massachusetts   之后(按字母顺序排列)的州的   New   Moon   作家,Massachusetts   是   New   Moon   Books   的所在地。  
   
  USE   pubs  
  SELECT   p.pub_name,   p.state,   a.au_lname,   a.au_fname,   a.state  
  FROM   publishers   p   INNER   JOIN   authors   a  
        ON   a.state   >   p.state  
  WHERE   p.pub_name   =   'New   Moon   Books'  
  ORDER   BY   au_lname   ASC,   au_fname   ASC  
   
  下面是结果集:  
   
  pub_name                   state       au_lname                           au_fname                           state    
  ----------------   -------   --------------------   --------------------   -----    
  New   Moon   Books       MA         Blotchet-Halls                   Reginald                           OR  
  New   Moon   Books       MA         del   Castillo                       Innes                                 MI  
  New   Moon   Books       MA         Greene                                   Morningstar                     TN  
  New   Moon   Books       MA         Panteley                               Sylvia                               MD  
  New   Moon   Books       MA         Ringer                                   Albert                               UT  
  New   Moon   Books       MA         Ringer                                   Anne                                   UT  
   
  (6   row(s)   affected)  
   
  使用不等运算符的联接  
  很少使用不等联接   (<   >)。通常不等联接只有与自联接同时使用才有意义。例如,可以使用下面的不等   Transact-SQL   联接和自联接查找包含不同价格的两本或多本廉价(低于   $15)书的类别:  
   
  USE   pubs  
  SELECT   DISTINCT   t1.type,   t1.price  
  FROM   titles   t1   INNER   JOIN   titles   t2    
        ON   t1.type   =   t2.type  
        AND   t1.price   <>   t2.price  
  WHERE   t1.price   <   $15   AND   t2.price   <   $15  
   
   
   
  说明     表达式   NOT   column_name   =   column_name   与表达式   column_name   <   >   column_name   等效。  
   
   
  下面的   Transact-SQL   示例中,使用不等联接和自联接的组合查找   titleauthor   表中的所有行,在该表中有两行或多行具有相同的   title_id   但   au_id   号不同(即一本书有多个作者):  
   
  USE   pubs  
  SELECT   DISTINCT   t1.au_id,   t1.title_id  
  FROM   titleauthor   t1   INNER   JOIN   titleauthor   t2    
        ON   t1.title_id   =   t2.title_id  
  WHERE   t1.au_id   <>   t2.au_id  
  ORDER   BY   t1.au_id  
   
  下面是结果集:  
   
  au_id                         title_id  
  -----------                   --------  
  213-46-8915                   BU1032  
  267-41-2394                   BU1111  
  267-41-2394                   TC7777  
  409-56-7008                   BU1032  
  427-17-2319                   PC8888  
  472-27-2349                   TC7777  
  672-71-3249                   TC7777  
  722-51-5454                   MC3021  
  724-80-9391                   BU1111  
  724-80-9391                   PS1372  
  756-30-7391                   PS1372  
  846-92-7186                   PC8888  
  899-46-2035                   MC3021  
  899-46-2035                   PS2091  
  998-72-3567                   PS2091  
   
  (15   row(s)   affected)Top

3 楼zbxubing(冰)回复于 2006-03-04 16:40:09 得分 0

使用外联接  
  仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。内联接消除与另一个表中的任何行不匹配的行。而外联接会返回   FROM   子句中提到的至少一个表或视图的所有行,只要这些行符合任何   WHERE   或   HAVING   搜索条件。将检索通过左向外联接引用的左表的所有行,以及通过右向外联接引用的右表的所有行。完整外部联接中两个表的所有行都将返回。  
   
  Microsoft&reg;   SQL   Server&#8482;   2000   对在   FROM   子句中指定的外联接使用以下   SQL-92   关键字:    
   
  LEFT   OUTER   JOIN   或   LEFT   JOIN  
   
   
  RIGHT   OUTER   JOIN   或   RIGHT   JOIN  
   
   
  FULL   OUTER   JOIN   或   FULL   JOIN    
  SQL   Server   支持   SQL-92   外联接语法,以及在   WHERE   子句中使用   *=   和   =*   运算符指定外联接的旧式语法。由于   SQL-92   语法不容易产生歧义,而旧式   Transact-SQL   外联接有时会产生歧义,因此建议使用   SQL-92   语法。  
   
  使用左向外联接  
  假设在   city   列上联接   authors   表和   publishers   表。结果只显示在出版商所在城市居住的作者(本例中为   Abraham   Bennet   和   Cheryl   Carson)。  
   
  若要在结果中包括所有的作者,而不管出版商是否住在同一个城市,请使用   SQL-92   左向外联接。下面是   Transact-SQL   左向外联接的查询和结果:  
   
  USE   pubs  
  SELECT   a.au_fname,   a.au_lname,   p.pub_name  
  FROM   authors   a   LEFT   OUTER   JOIN   publishers   p  
        ON   a.city   =   p.city  
  ORDER   BY   p.pub_name   ASC,   a.au_lname   ASC,   a.au_fname   ASC  
   
  下面是结果集:  
   
  au_fname                           au_lname                                               pub_name                      
  --------------------   ------------------------------   -----------------    
  Reginald                           Blotchet-Halls                                   NULL  
  Michel                               DeFrance                                               NULL  
  Innes                                 del   Castillo                                       NULL  
  Ann                                     Dull                                                       NULL  
  Marjorie                           Green                                                     NULL  
  Morningstar                     Greene                                                   NULL  
  Burt                                   Gringlesby                                           NULL  
  Sheryl                               Hunter                                                   NULL  
  Livia                                 Karsen                                                   NULL  
  Charlene                           Locksley                                               NULL  
  Stearns                             MacFeather                                           NULL  
  Heather                             McBadden                                               NULL  
  Michael                             O'Leary                                                 NULL  
  Sylvia                               Panteley                                               NULL  
  Albert                               Ringer                                                   NULL  
  Anne                                   Ringer                                                   NULL  
  Meander                             Smith                                                     NULL  
  Dean                                   Straight                                               NULL  
  Dirk                                   Stringer                                               NULL  
  Johnson                             White                                                     NULL  
  Akiko                                 Yokomoto                                               NULL  
  Abraham                             Bennet                                                   Algodata   Infosystems  
  Cheryl                               Carson                                                   Algodata   Infosystems  
   
  (23   row(s)   affected)  
   
  不管是否与   publishers   表中的   city   列匹配,LEFT   OUTER   JOIN   均会在结果中包含   authors   表的所有行。注意:结果中所列的大多数作者都没有相匹配的数据,因此,这些行的   pub_name   列包含空值。Top

4 楼wangtiecheng(不知不为过,不学就是错!)回复于 2006-03-06 21:16:03 得分 0

如一楼所述,使用动态SQL语句,但这不适用于临时表  
   
   
  动态sql语句基本语法    
  1   :普通SQL语句可以用Exec执行    
   
  eg:       Select   *   from   tableName    
                    Exec('select   *   from   tableName')    
                    Exec   sp_executesql   N'select   *   from   tableName'         --   请注意字符串前一定要加N    
   
  2:字段名,表名,数据库名之类作为变量时,必须用动态SQL    
   
  eg:        
  declare   @fname   varchar(20)    
  set   @fname   =   'FiledName'    
  Select   @fname   from   tableName                             --   错误,不会提示错误,但结果为固定值FiledName,并非所要。    
  Exec('select   '   +   @fname   +   '   from   tableName')           --   请注意   加号前后的   单引号的边上加空格    
   
  当然将字符串改成变量的形式也可    
  declare   @fname   varchar(20)    
  set   @fname   =   'FiledName'   --设置字段名    
   
  declare   @s   varchar(1000)    
  set   @s   =   'select   '   +   @fname   +   '   from   tableName'    
  Exec(@s)                                 --   成功    
  exec   sp_executesql   @s       --   此句会报错    
   
   
   
  declare   @s   Nvarchar(1000)     --   注意此处改为nvarchar(1000)    
  set   @s   =   'select   '   +   @fname   +   '   from   tableName'    
  Exec(@s)                                 --   成功            
  exec   sp_executesql   @s       --   此句正确    
   
  3.   输出参数    
  declare   @num   int,    
                  @sqls   nvarchar(4000)    
  set   @sqls='select   count(*)   from   tableName'    
  exec(@sqls)    
  --如何将exec执行结果放入变量中?    
   
  declare   @num   int,    
                                @sqls   nvarchar(4000)    
  set   @sqls='select   @a=count(*)   from   tableName   '    
  exec   sp_executesql   @sqls,N'@a   int   output',@num   output    
  select   @num    
   
  Top

相关问题

  • 简单sql语句
  • 简单Sql语句问题?
  • 问一简单SQL语句
  • 简单的sql语句?
  • 求一简单sql语句
  • sql 语句简单问题?
  • 求一简单SQL语句
  • 求简单SQL,语句!!唉
  • 求一简单SQL语句
  • 求一简单SQL语句

关键词

  • ps2
  • 联接
  • 语句
  • 语法
  • au
  • 表
  • 运算符
  • fname
  • 子句
  • lname

得分解答快速导航

  • 帖主:yinhuiling

相关链接

  • SQL Server类图书

广告也精彩

反馈

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