我想问的是不如select a.m,a.n,b.m,b.c from a,b where a.m=b.m(+)
select a.m,a.n,b.m,b.c from a,b where a.m(+)=b.m就会不同的结果想要这方面的资料就是关于  LEFT JOIN ON  LEFT OUT JOIN  UNION等等这方面的资料
一得就给分直接回帖或给我发邮件[email protected]

解决方案 »

  1.   

    一个是左联相当于left out join
    右联相当right out join
    只不过(+)是oracle 特有的,left join是标准SQL
      

  2.   

    给你个万能的资料 --> Google!
      

  3.   

    以a.m=b.m(+)为例,
    则说明b表记录缺乏,需要用这个符号,否则就会因为关联不上而使a表的记录不能全部显示
    而因为a在左边,也称做左连接,用left join on 的话这样写:
    select a.m,a.n,b.m,b.c from a left join b on a.m=b.m
    用句简单的话来说,要显示全部的记录,则哪个表记录不够关联就要加上(+) 
      

  4.   

    select a.m,a.n,b.m,b.c from a,b where a.m=b.m(+) 
    select a.m,a.n,b.m,b.c from a,b where a.m(+)=b.m 得到不同的结果,是正确的.
    .....where a.m=b.m(+) 右边所有的加上左边符合条件的
    .....where a.m(+)=b.m 左边所有的加上右边符合条件的
     
      

  5.   

    3楼说的很清楚了我来举个例子
    create table TEST
    (
      ID   NUMBER,
      NAME VARCHAR2(30)
    );
    数据
    ID     NAME
    1 w
    3 e
    4 3e
    5 e
    s
    create table TEST1
    (
      ID   NUMBER,
      NAME VARCHAR2(30)
    );
    1 k
    2 j
    2 n
    3 m
    4 l
    tSELECT A.ID,A.NAME,B.ID,B.NAME FROM TEST A ,TEST1 B WHERE A.ID=B.ID(+);
    结果
    1 k 1 w
    2 j
    2 n
    3 m 3 e
    4 l 4 3e
    t
    SELECT A.ID,A.NAME,B.ID,B.NAME FROM TEST A ,TEST1 B WHERE A.ID(+)=B.ID;
    结果
    1 k 1 w
    3 m 3 e
    4 l 4 3e
    5 e
    s
    如果是全外连接8行记录过滤点重复的3行
      

  6.   

    最好不用+用标准的SQL吧迁移问题啊
      

  7.   

    数据库表连接有三种:
    1 内连接 inner join  就是把两表完全符合连接条件的数据连接起来2 外连接  outer join  这里分左连接、右连接和全连接
     楼主举例就是这种情况(ORACLE数据库) 
    where a.m=b.m(+) 右连接,右边所有的加上左边符合条件的 
    where a.m(+)=b.m 左连接,左边所有的加上右边符合条件的3 cross join 笛卡儿连接
    就是全部连接,如a表10条数据, b表4条数据 结果表就是10*4=40条数据
      

  8.   

    Inner Join 及 Outer Join 以及其应用 
    inner join(等值连接) 只返回两个表中联结字段相等的行 
    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 
    right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 Inner Join 
    Inner Join 应该是最常用的 Join 方式, 它只会传回符合 Join 规则的纪录, 还是先来看看语法 
    Select <要选择的字段> From <主要资料表> 
    <次要资料表> [On ] 
    现在我们利用 MS SQL 内建的北风数据库来实际练习一下! 想多了解 MS SQL 的内建数据库, 你可以看看 SQL Server 的内建数据库 这篇文章 请打开 QA (Query Analyzer), 为了使用北风数据库, 请先执行 Use Northwind, 然后执行 
    Select ProductId, ProductName, SupplierId From Products 
    从 Products 产品资料表中取出三个字段, 分别是产品代码, 产品名称, 供货商代码, 但查询出来的结果保证让你的老板很不满意, 因为供货商代码对于人类实在是无虾米意义, 这个时候 Join 就可以帮上忙了, 藉由 Join Suppliers 这个资料表我们便可以查询到供货商名称 
    Select ProductId, ProductName, Suppliers.SupplierId 
    From Products 
    Inner Join Suppliers 
    Products.Suppliers = Suppliers.SupplierId 
    这款的查询结果是不是卡清楚呢! Inner Join 的主要精神就是 exclusive , 叫它做排他性吧! 就是讲 Join 规则不相符的资料就会被排除掉, 譬如讲在 Product 中有一项产品的供货商代码 (SupplierId), 没有出现在 Suppliers 资料表中, 那么这笔记录便会被排除掉 Outer Join 
    这款的 Join 方式是一般人比较少用到的, 甚至有些 SQL 的管理者也从未用过, 这真是一件悲哀的代志, 因为善用 Outer Join 是可以简化一些查询的工作的, 先来看看 Outer Join 的语法 
    Select <要查询的字段> From 
    [Outer] Join On 
    语法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本质上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查询结果会包含所有 Left 资料表的资料, 颠倒过来讲, Right Outer Join 的查询就会包含所有 Right 资料表的资料, 接下来我们还是来做些实际操作, 仍然是使用北风数据库, 但要先做一些小小的修改, 才能达到我们要的结果 。
    首先要拿掉 Products 资料表的 Foreign Key, 否则没有法度在 Products 资料表新增一笔 SupplierId 没有对映到 Suppliers 资料表的纪录, 要知影一个资料表的 Constraint 你可以执行 SQL 内建的 sp_helpconstraint , 在 QA 执行 
    sp_helpconstraint Products 
    接下来删除 FK_Products_Suppliers 这个 Foreign Key 
    Alter Table Products 
    Drop Constraint FK_Products_Suppliers 
    再来新增一笔纪录于 Products 资料表, SupplierId 使用 50 是因为它并没有对映到 Suppliers 资料表中的记录 
    Insert Into Products (ProductName,SupplierId,CategoryId) 
    values ('Test Product','50','1') 
    现在我们再执行头前的查询, 只是将 Inner Join 改为 Left Outer Join 
    Select ProductId, ProductName, Suppliers.SupplierId 
    From Products 
    Left Outer Join Suppliers 
    Products.Suppliers = Suppliers.SupplierId 
    比较一下两种 Join 方式的查询结果, 你应该就会知影其中的差别! 
    再来看看 Right Outer Join, 请新增下底这笔记录 
    Insert Into Suppliers (CompanyName) values ('LearnASP') 
    现在请使用 Right Out Join 来作查询, 比较看看查询的结果和 Inner Join 有什么不同! 
    寻找不相符纪录 
    这里我们来看看如何使用 Out Join 来找不相符纪录, 可能是有子纪录却没有父纪录或是颠倒过来 
    Select Suppliers.CompanyName From Products 
    Right Join Suppliers 
    On Products.SupplierId = Suppliers.SupplierId 
    Where Products.SupplierId is Null 
    执行结果你会找到一笔资料为 LearnASP, 该笔供货商资料存在, 但基本上已经没有产品是来自这个供货商, 想象一下如果不用 Outer Join 你要怎么以一个 SQL 指令完成同一查询结果! 知道 Outer Join 的好用了吧! 再执行 
    Select Products.ProductName 
    From Products 
    Left Join Suppliers 
    On Products.SupplierId = Suppliers.SupplierId 
    Where Suppliers.SupplierId is Null 
    这个查询结果你会发现 Test Product 这项产品竟然找不到供货商的资料!
      

  9.   

    给你举例很简单的自己理解
    inner join、 left join 、right join、 outer join之间的区别
    A表(a1,b1,c1) B表(a2,b2) 
    a1 b1 c1 a2 b2 
    01 数学 95 01 张三 
    02 语文 90 02 李四 
    03 英语 80 04 王五 
    select A.*,B.* from A 
    inner join B on(A.a1=B.a2) 
    结果是: 
    a1 b1 c1 a2 b2 
    01 数学 95 01 张三 
    02 语文 90 02 李四 select A.*,B.* from A 
    left outer join B on(A.a1=B.a2) 相当于 select a.*,b.* from a,b where a.id=b.id(+)左链接
    结果是: 
    a1 b1 c1 a2 b2 
    01 数学 95 01 张三 
    02 语文 90 02 李四 
    03 英语 80 NULL NULL select A.*,B.* from A 
    right outer join B on(A.a1=B.a2)  相当于 select a.*,b.* from a,b where a.id(+)=b.id右链接
    结果是: 
    a1 b1 c1 a2 b2 
    01 数学 95 01 张三 
    02 语文 90 02 李四 
    NULL NULL NULL 04 王五 select A.*,B.* from A 
    full outer join B on(A.a1=B.a2) 
    结果是: 
    a1 b1 c1 a2 b2 
    01 数学 95 01 张三 
    02 语文 90 02 李四 
    03 英语 80 NULL NULL 
    NULL NULL NULL 04 王五
      

  10.   

    a.id(+)=b.id
    一般是因为b.id多,a.id少。简言之,缺补
      

  11.   

    a.m=b.m(+)
    左连接
    a.m(+)=b.m 
    右连接