外连接分:左连接、右连接
左连接:LEFT右边的表中若无内容,则以NULL补;
右连接:RIGHT左边的表若无内容,则以NULL补内连接:只显示在INNER 右边的表中有的记录
以SQL Server语法为例:
Table1、Table2
Select * From Table1 Left Join Talbe2 On ……:查询结果为,满足On条件后,如果Table2中没记录,则以NULL补充;
Select * From Table1 Right Join Talbe2 On ……:查询结果为,满足On条件后,如果Table1中没记录,则以NULL补充;Select * From Table1 Inner Join Table2 On ……:查询结果为,满足On条件后,只显示Table2中有的记录。

解决方案 »

  1.   

    Oracle的语法表示如何表示????????
      

  2.   

    Let’s review the syntax differences between these variations in join syntax:Left outer join:  Oracle8iselect   last_name,   department_name
    from   employees e,   departments d
    where   e.department_id = d.department_id(+);Left outer join:  Oracle9iselect   last_name,   department_name
    from   employees eleft outer join   departments don   e.department_id = d.department_id;Right outer join: Oracle8iselect   last_name,   department_name
    from   employees e,   departments d
    where   e.department_id(+) = d.department_id;Right outer join: Oracle9iselect   last_name,   department_name
    from   employees eright outer join   departments don   e.department_id = d.department_id;The full outer join has no direct equivalent in Oracle8i, but it is very handy to find missing rows in both tables being joined.  In the example below, we include employees with departments as well as departments without employees:select   last_name,   department_namefrom   employees efull outer join   departments don e.department_id = d.department_id;
      

  3.   

    左连接,右连接用(+),9I还新增了SQL SERVER的INNER 功能。
      

  4.   

    使用左向外联接
    假设在 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 列包含空值。使用右向外联接
    假设在 city 列上联接 authors 表和 publishers 表。结果只显示在出版商所在城市居住的作者(本例中为 Abraham Bennet 和 Cheryl Carson)。SQL-92 右向外联接运算符 RIGHT OUTER JOIN 指明:不管第一个表中是否有匹配的数据,结果将包含第二个表中的所有行。若要在结果中包括所有的出版商,而不管城市中是否还有出版商居住,请使用 SQL-92 右向外联接。下面是 Transact-SQL 右向外联接的查询和结果:USE pubs
    SELECT a.au_fname, a.au_lname, p.pub_name
    FROM authors AS a RIGHT OUTER JOIN publishers AS 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             
    -------------------- ------------------------ -------------------- 
    Abraham              Bennet                   Algodata Infosystems
    Cheryl               Carson                   Algodata Infosystems
    NULL                 NULL                     Binnet & Hardley
    NULL                 NULL                     Five Lakes Publishing
    NULL                 NULL                     GGG&G
    NULL                 NULL                     Lucerne Publishing
    NULL                 NULL                     New Moon Books
    NULL                 NULL                     Ramona Publishers
    NULL                 NULL                     Scootney Books(9 row(s) affected)使用谓词(如将联接与常量比较)可以进一步限制外联接。下例包含相同的右向外联接,但消除销售量低于 50 本的书籍的书名:USE pubs
    SELECT s.stor_id, s.qty, t.title
    FROM sales s RIGHT OUTER JOIN titles t
       ON s.title_id = t.title_id
       AND s.qty > 50
    ORDER BY s.stor_id ASC下面是结果集:stor_id qty    title                                                     
    ------- ------ --------------------------------------------------------- 
    (null) (null) But Is It User Friendly?                                   
    (null) (null) Computer Phobic AND Non-Phobic Individuals: Behavior 
                Variations                  
    (null) (null) Cooking with Computers: Surreptitious Balance Sheets       
    (null) (null) Emotional Security: A New Algorithm                        
    (null) (null) Fifty Years in Buckingham Palace Kitchens                  
    7066   75     Is Anger the Enemy?                                        
    (null) (null) Life Without Fear                                          
    (null) (null) Net Etiquette                                              
    (null) (null) Onions, Leeks, and Garlic: Cooking Secrets of the 
                Mediterranean                  
    (null) (null) Prolonged Data Deprivation: Four Case Studies              
    (null) (null) Secrets of Silicon Valley                                  
    (null) (null) Silicon Valley Gastronomic Treats                          
    (null) (null) Straight Talk About Computers                              
    (null) (null) Sushi, Anyone?                                             
    (null) (null) The Busy Executive's Database Guide                        
    (null) (null) The Gourmet Microwave                                      
    (null) (null) The Psychology of Computer Cooking                         
    (null) (null) You Can Combat Computer Stress!                            (18 row(s) affected)有关谓词的更多信息,请参见 WHERE。 使用完整外部联接
    若要通过在联接结果中包括不匹配的行保留不匹配信息,请使用完整外部联接。Microsoft® SQL Server™ 2000 提供完整外部联接运算符 FULL OUTER JOIN,不管另一个表是否有匹配的值,此运算符都包括两个表中的所有行。假设在 city 列上联接 authors 表和 publishers 表。结果只显示在出版商所在城市居住的作者(本例中为 Abraham Bennet 和 Cheryl Carson)。SQL-92 FULL OUTER JOIN 运算符指明:不管表中是否有匹配的数据,结果将包括两个表中的所有行。若要在结果中包括所有作者和出版商,而不管城市中是否有出版商或者出版商是否住在同一个城市,请使用完整外部联接。下面是 Transact-SQL 完整外部联接的查询和结果:USE pubs
    SELECT a.au_fname, a.au_lname, p.pub_name
    FROM authors a FULL OUTER JOIN publishers p
       ON a.city = p.city
    ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC
    在oracle中:
    a left join b on a.id=b.id   =====>   a.id=b.id(+)
    a right join b on a.id=b.id  =====>   a.id(+)=b.id
      

  5.   

    请问plSQl学习,现在市面上的哪本书最好啊。有没有很全的电子文档。不是Orale上的英文电子文档,我是指电子书之类的。
      

  6.   

    这里面绝对有你想要的
    http://211.99.196.144:8090/forum1/frontshow/list.jsp?ordertype=0&page=3&boardid=105
      

  7.   

    Table1、Table2
    Select * From Table1 Left Join Talbe2 On ……:查询结果为,满足On条件后,如果Table2中没记录,则以NULL补充;
    Select * From Table1 Right Join Talbe2 On ……:查询结果为,满足On条件后,如果Table1中没记录,则以NULL补充;Select * From Table1 Inner Join Table2 On ……:查询结果为,满足On条件后,只显示Table2中有的记录。
      

  8.   

    设A表,B表两表连接后的记录数为 A×B 记录,然后根椐连接条件进行过滤外连接指  A表及B表中不在A表及B表交集里的集合(有图形比较好理解)就是交集的其它部分
    内连接指  A表及B表交集
    左连接指  整个A表
    右连接指  整个B表
      

  9.   

    SQL语句导入导出大全    txlicenhe(原作) 
      
    关键字     导入导出 DTS 
      
    /*******  导出到excel
    EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'/***********  导入Excel
    SELECT * 
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions/*动态文件名
    declare @fn varchar(20),@s varchar(1000)
    set @fn = 'c:\test.xls'
    set @s ='''Microsoft.Jet.OLEDB.4.0'',
    ''Data Source="'+@fn+'";User ID=Admin;Password=;Extended properties=Excel 5.0'''
    set @s = 'SELECT * FROM OpenDataSource ('+@s+')...sheet1$'
    exec(@s)
    */SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+' ' 转换后的别名
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions/********************** EXCEL导到远程SQL
    insert OPENDATASOURCE(
             'SQLOLEDB',
             'Data Source=远程ip;User ID=sa;Password=密码'
             ).库名.dbo.表名 (列名1,列名2)
    SELECT 列名1,列名2
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
    /** 导入文本文件
    EXEC master..xp_cmdshell 'bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword'/** 导出文本文件
    EXEC master..xp_cmdshell 'bcp dbname..tablename out c:\DT.txt -c -Sservername -Usa -Ppassword'

    EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword'导出到TXT文本,用逗号分开
    exec master..xp_cmdshell 'bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password'
    BULK INSERT 库名..表名
    FROM 'c:\test.txt'
    WITH (
        FIELDTERMINATOR = ';',
        ROWTERMINATOR = '\n'
    )
    --/* dBase IV文件
    select * from 
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料4.dbf]')
    --*/--/* dBase III文件
    select * from 
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料3.dbf]')
    --*/--/* FoxPro 数据库
    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
    'select * from [aa.DBF]')
    --*//**************导入DBF文件****************/
    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;
    SourceDB=e:\VFP98\data;
    SourceType=DBF',
    'select * from customer where country != "USA" order by country')
    go
    /***************** 导出到DBF ***************/
    如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句insert into openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
    'select * from [aa.DBF]')
    select * from 表说明:
    SourceDB=c:\  指定foxpro表所在的文件夹
    aa.DBF        指定foxpro表的文件名. 
    /*************导出到Access********************/
    insert into openrowset('Microsoft.Jet.OLEDB.4.0', 
       'x:\A.mdb';'admin';'',A表) select * from 数据库名..B表/*************导入Access********************/
    insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0', 
       'x:\A.mdb';'admin';'',A表)文件名为参数
    declare @fname varchar(20)
    set @fname = 'd:\test.mdb'
    exec('SELECT a.* FROM opendatasource(''Microsoft.Jet.OLEDB.4.0'',
        '''+@fname+''';''admin'';'''', topics) as a ')SELECT * 
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="f:\northwind.mdb";Jet OLEDB:Database Password=123;User ID=Admin;Password=;')...产品*********************  导入 xml 文件DECLARE @idoc int
    DECLARE @doc varchar(1000)
    --sample XML document
    SET @doc ='
    <root>
      <Customer cid= "C1" name="Janine" city="Issaquah">
          <Order oid="O1" date="1/20/1996" amount="3.5" />
          <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied
          </Order>
       </Customer>
       <Customer cid="C2" name="Ursula" city="Oelde" >
          <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue 
                 white red">
                <Urgency>Important</Urgency>
                Happy Customer.
          </Order>
          <Order oid="O4" date="1/20/1996" amount="10000"/>
       </Customer>
    </root>
      

  10.   

    '
    -- Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc-- Execute a SELECT statement using OPENXML rowset provider.
    SELECT *
    FROM OPENXML (@idoc, '/root/Customer/Order', 1)
          WITH (oid     char(5), 
                amount  float, 
                comment ntext 'text()')
    EXEC sp_xml_removedocument @idoc ???????/**********************Excel导到Txt****************************************/
    想用
    select * into opendatasource(...) from opendatasource(...)
    实现将一个Excel文件内容导入到一个文本文件假设Excel中有两列,第一列为姓名,第二列为很行帐号(16位)
    且银行帐号导出到文本文件后分两部分,前8位和后8位分开。
    邹健:
    如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2
    然后就可以用下面的语句进行插入
    注意文件名和目录根据你的实际情况进行修改.insert into
    opendatasource('MICROSOFT.JET.OLEDB.4.0'
    ,'Text;HDR=Yes;DATABASE=C:\'
    )...[aa#txt]
    --,aa#txt)
    --*/
    select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8) 
    from 
    opendatasource('MICROSOFT.JET.OLEDB.4.0'
    ,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls'
    --,Sheet1$)
    )...[Sheet1$] 如果你想直接插入并生成文本文件,就要用bcpdeclare @sql varchar(8000),@tbname varchar(50)--首先将excel表内容导入到一个全局临时表
    select @tbname='[##temp'+cast(newid() as varchar(40))+']'
     ,@sql='select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8) 
     into '+@tbname+' from 
    opendatasource(''MICROSOFT.JET.OLEDB.4.0''
    ,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls''
    )...[Sheet1$]'
    exec(@sql)--然后用bcp从全局临时表导出到文本文件
    set @sql='bcp "'+@tbname+'" out "c:\aa.txt" /S"(local)" /P"" /c'
    exec master..xp_cmdshell @sql--删除临时表
    exec('drop table '+@tbname)
    /********************导整个数据库*********************************************/用bcp实现的存储过程
    /*
     实现数据导入/导出的存储过程
             根据不同的参数,可以实现导入/导出整个数据库/单个表
     调用示例:
    --导出调用示例
    ----导出单个表
    exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',1
    ----导出整个数据库
    exec file2table 'zj','','','xzkh_sa','C:\docman',1--导入调用示例
    ----导入单个表
    exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',0
    ----导入整个数据库
    exec file2table 'zj','','','xzkh_sa','C:\docman',0*/
    if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
     drop procedure File2Table
    go
    create procedure File2Table
    @servername varchar(200)  --服务器名
    ,@username varchar(200)   --用户名,如果用NT验证方式,则为空''
    ,@password varchar(200)   --密码
    ,@tbname varchar(500)   --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表
    ,@filename varchar(1000)  --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt
    ,@isout bit      --1为导出,0为导入
    as
    declare @sql varchar(8000)if @tbname like '%.%.%' --如果指定了表名,则直接导出单个表
    begin
     set @sql='bcp '+@tbname
      +case when @isout=1 then ' out ' else ' in ' end
      +' "'+@filename+'" /w'
      +' /S '+@servername
      +case when isnull(@username,'')='' then '' else ' /U '+@username end
      +' /P '+isnull(@password,'')
     exec master..xp_cmdshell @sql
    end
    else
    begin --导出整个数据库,定义游标,取出所有的用户表
     declare @m_tbname varchar(250)
     if right(@filename,1)<>'\' set @filename=@filename+'\' set @m_tbname='declare #tb cursor for select name from '+@tbname+'..sysobjects where xtype=''U'''
     exec(@m_tbname)
     open #tb
     fetch next from #tb into @m_tbname
     while @@fetch_status=0
     begin
      set @sql='bcp '+@tbname+'..'+@m_tbname
       +case when @isout=1 then ' out ' else ' in ' end
       +' "'+@filename+@m_tbname+'.txt " /w'
       +' /S '+@servername
       +case when isnull(@username,'')='' then '' else ' /U '+@username end
       +' /P '+isnull(@password,'')
      exec master..xp_cmdshell @sql
      fetch next from #tb into @m_tbname
     end
     close #tb
     deallocate #tb 
    end
    go
    /************* Oracle **************/
    EXEC sp_addlinkedserver 'OracleSvr', 
       'Oracle 7.3', 
       'MSDAORA', 
       'ORCLDB'
    GOdelete from openquery(mailser,'select *  from yulin')select *  from openquery(mailser,'select *  from yulin')update openquery(mailser,'select * from  yulin where id=15')set disorder=555,catago=888insert into openquery(mailser,'select disorder,catago from  yulin')values(333,777) 补充:对于用bcp导出,是没有字段名的.用openrowset导出,需要事先建好表.用openrowset导入,除ACCESS及EXCEL外,均不支持非本机数据导入