呵呵,看看我收集的资料: SELECT /*+INDEX(D PK_STOCKDAY)*/ G.GDSNAME, G.GDSID, G.GDSINID, G.SPECIFY,
    G.UOMID,G.SalePrice,0 as QTY,SUM(D.ADDQTY) AS PROFQTY 
   FROM GOODS G,STOCKDAY D
  WHERE ( G.ACCOUNTID = :LS_ACCOUNTID ) 
    AND ( G.GDSID like :LS_GDSID )  
    AND ( D.GDSINID(+) = G.GDSINID)
    AND ( D.STOCKLOCID(+) =:LS_STOCKLOCID )
    AND ( D.ACCOUNTID(+) = :LS_ACCOUNTID1 )
    AND ( D.CUSTOMERID(+) = :LS_CUSTOMERID)
    AND ( D.DAY(+) <= :LS_BILLDT)
  GROUP BY G.GDSNAME,G.GDSID,G.GDSINID,G.SPECIFY,G.UOMID,G.SalePrice;可以改为:  SELECT G.GDSNAME, G.GDSID, G.GDSINID, 
         G.SPECIFY,G.UOMID,G.SalePrice,0 as QTY,SUM(D.ADDQTY) AS PROFQTY 
   FROM GOODS G
   LEFT JOIN 
(select * from STOCKDAY where  
     ( STOCKLOCID =:LS_STOCKLOCID )      
    AND ( ACCOUNTID = :LS_ACCOUNTID1 )  
    AND ( CUSTOMERID = :LS_CUSTOMERID)  
    AND ( DAY <= :LS_BILLDT)            
 ) D ON ( D.GDSINID = G.GDSINID)  WHERE ( G.ACCOUNTID = :LS_ACCOUNTID )
    AND ( G.GDSID like :LS_GDSID )      
  GROUP BY G.GDSNAME,G.GDSID,G.GDSINID,G.SPECIFY,G.UOMID,G.SalePrice;<joined_table>由两个或更多表的积组成的结果集,例如:SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
    RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
        ON tab3.c1 = tab4.c1
        ON tab2.c3 = tab4.c3对于多个 CROSS 联接,请使用圆括号来更改联接的自然顺序。<join_type>指定联接操作的类型。INNER指定返回每对匹配的行。废弃两个表中不匹配的行。如果未指定联接类型,则这是默认设置。FULL [OUTER]指定在结果集中包含左表或右表中不满足联接条件的行,并将对应于另一个表的输出列设为 NULL。这是对通常由 INNER JOIN 返回的所有行的补充。说明  按此处指定的方法指定外联接或在 WHERE 子句中使用旧式非标准的 *= 和 =* 运算符都是可行的。不能在同一语句中同时使用这两种方法。
LEFT [OUTER]指定在结果集中包含左表中所有不满足联接条件的行,且在由内联接返回所有的行之外,将另外一个表的输出列设为 NULL。RIGHT [OUTER]指定在结果集中包含右表中所有不满足联接条件的行,且在由内联接返回的所有行之外,将与另外一个表对应的输出列设为 NULL。<join_hint>指定 SQL Server 查询优化器为在查询的 FROM 子句中指定的每个联接使用一个联接提示或执行算法。有关更多信息,请参见本主题下面的"联接提示"。JOIN指明所指定的联接操作应在给定的表或视图之间执行。ON <search_condition>指定联接所基于的条件。尽管经常使用列和比较运算符,但此条件可指定任何谓词,例如:SELECT ProductID, Suppliers.SupplierID
    FROM Suppliers JOIN Products 
    ON (Suppliers.SupplierID = Products.SupplierID)当条件指定列时,列不一定必须具有相同的名称或数据类型;但是,如果数据类型不一致,则这些列要么必须相互兼容,要么是 Microsoft? SQL Server? 能够隐性转换的类型。如果数据类型不能隐式转换,则条件必须使用 CAST 函数显式转换数据类型。 在 ON 子句中可能有仅涉及一个联接表的谓词。这样的谓词也可能出现在查询中的 WHERE 子句中。尽管这种谓词的放置在 INNER 联接中不会产生差别,但是在涉及 OUTER 联接时可能会导致不同的结果。这是因为 ON 子句中的谓词在应用于联接之前先应用于表,而 WHERE 子句在语意上应用于联接结果。有关搜索条件和谓词的更多信息,请参见搜索条件。 CROSS JOIN指定两个表的矢量积。这将返回相同的行,就好像在旧式的非 SQL-92 式联接中并没有指定 WHERE 子句。表提示
表提示指定一个表扫描、查询优化器要使用的一个或多个索引或查询优化器要在该表中为该 SELECT 语句使用的锁定方法。虽然这是一个选项,但查询优化器通常无须指定提示就能够选择最佳优化方法。 注意  因为 SQL Server 查询优化器通常为查询选择最优执行计划,所以建议只将 <join_hint>、<query_hint>、<table_hint> 和 <view_hint> 作为经验丰富的开发人员和数据库管理员的最终手段。
如果查询计划不访问表,则忽略表提示。这可能是优化器作出完全不访问该表的选择的结果,或改为访问索引视图。在后一种情况中,使用 OPTION (EXPAND VIEWS) 查询提示可阻止使用索引视图。鼓励在表提示之间使用逗号,尽管这是可选的。向后兼容性支持使用空格而不是逗号分隔提示。鼓励使用 WITH 关键字,尽管目前这还不是必须。在将来的 SQL Server 版本中,WITH 可能会成为必需的关键字。在 SQL Server 2000 中,所有的锁提示都传播给视图中引用的所有基表和视图。另外,SQL Server 执行相应的锁一致性检查。如果表(包括系统表)中包含计算列,而这些计算列由访问其它表中的列的表达式或函数计算而得,则不在那些表上使用表提示(不传播表提示)。例如,在查询中的表上指定 NOLOCK 表提示。该表包含由访问另一表中的列的表达式和函数组合计算到的计算列。这些由表达式和函数引用的表在被访问时并不使用 NOLOCK 表提示。对于 FROM 子句中的每个表,SQL Server 不允许有来自下列各组的多个表提示: 粒度提示:PAGLOCK、NOLOCK、ROWLOCK、TABLOCK 或 TABLOCKX。 
隔离级别提示:HOLDLOCK、NOLOCK、READCOMMITTED、REPEATABLEREAD 或 SERIALIZABLE。 
NOLOCK、READUNCOMMITTED 和 READPAST 表提示不能用于将进行删除、插入或更新操作的表。
连接子句(Join clauses)Microsoft SQL Server 7.0允许在一个连接子句中连接多达256个表,包括临时的和永久的表。在Oracle中,没有连接限制。在Oracle中使用外部连接时,外部连接操作符(+)典型的放置在子列(foreign key)的后面。(+)依靠少数几个唯一值来识别该列。除非子列允许空值,否则总是这样的。如果子列允许空值,则(+)被放置在父列(PRIMARY KEY或者UNIQUE约束)上。你不能把(+)同时放在等号(=)的两边。用SQL Server,你可以使用(*=)和(=*)外部连接操作符。(*)用来标识一个有很多唯一值的列。如果子列不允许空值,则(*)被放在等号的父列一边。在Oracle中,(*)的放置正好相反。不能把(*)同时放在等号的两边。(*=)和(=*)被认为是传统的连接操作符。SQL Server也支持下面列出的SQL-92标准的连接操作符。建议你使用这种语法。SQL-92标准语法比(*)操作符更强大,限制更小。Join操作 描述 
CROSS JOIN 这是两个表的交叉产物。如果在一个旧式的连接中没有指定WHERE子句,则返回同一行。在Oracle中,这种类型的连接叫做笛卡儿连接。 
INNER 该连接指定返回所有的内部行。任何不匹配的行将被丢弃。该连接同一个标准的Oracle表连接是一样的。 
LEFT[OUTER]  这种类型的连接指定返回右边表的所有外部行,即使没有发现任何匹配行。该操作符同Oracle外部连接(+)是一样的。 
RIGHT[OUTER]  这种类型的连接指定返回左边表的所有外部行,即使没有发现任何匹配行。该操作符同Oracle外部连接(+)是一样的。 
FULL [OUTER] 如果来自任一表的一行不匹配选择标准,指定该行被包括到结果集中,并且它的符合其它表的输出列被设定为NULL。这和把Oracle外部连接操作符放在“=”的两端是一样的(col1(+) = col2(+)),而在Oracle中,这是不允许的。  下面的例子返回所有学生都要上的课程的一个清单。在学生表和年级表之间定义的外部连接允许显示所有的学生,甚至那些没有参加任何课程的学生。在课程表上也有一个外部连接,该连接返回课程名字。如果课程表上没有加上外部连接,则不会返回那些没有参加任何课程的学生,因为他们的课程代码(CCDOE)是空值。Oracle  Microsoft SQL Server  
SELECT S.SSN AS SSN,
FNAME, LNAME
FROM STUDENT_ADMIN.STUDENT S,
DEPT_ADMIN.CLASS C,
STUDENT_ADMIN.GRADE G
WHERE S.SSN = G.SSN(+)
AND G.CCODE = C.CCODE(+) 
SELECT S.SSN AS SSN,
FNAME, LNAME
FROM STUDENT_ADMIN.GRADE G
RIGHT OUTER JOIN
STUDENT_ADMIN.STUDENT S
ON G.SSN = S.SSN
LEFT OUTER JOIN
DEPT_ADMIN.CLASS C
ON G.CCODE = C.CCODE   用SELECT语句做表名Microsoft SQL Server和Oracle都支持在执行查询时用SELECT语句作为表源。SQL Server需要一个别名(alias);而在Oracle中是否使用别名是可选的。Oracle  Microsoft SQL   
SELECT SSN, LNAME, FNAME,
TUITION_PAID, SUM_PAID
FROM STUDENT_ADMIN.STUDENT,
(SELECT SUM(TUITION_PAID) SUM_PAID FROM
    STUDENT_ADMIN.STUDENT) 
SELECT SSN, LNAME, FNAME,
TUITION_PAID, SUM_PAID
FROM STUDENT_ADMIN.STUDENT,
(SELECT SUM(TUITION_PAID) SUM_PAID FROM
     STUDENT_ADMIN.STUDENT) SUM_STUDENT  

解决方案 »

  1.   

    你說的是MS SQL Server的語法吧?我想要的是orcale
      

  2.   

    select a.ucode ,a.uname,b.price 
     from test1 a inner join test2 b on a.ucode=b.ucode
      

  3.   

    a.ucode=b.ucode(+)
    a.ucode(+)=b.ucode
      

  4.   

    呵呵,楼主没有仔细看吧,我的文章里的很清楚的,前面的是SQL SEVER的语句,后面的则是ORACLE的语法,两个列在一,是为了方便比较说明使用的还有呀,INNER JOIN是SQL 92的标准,在ORACLE中应该也是能够正常使用的
      

  5.   

    oracle8i 及8i以下都没有join语句,你必须这样写,举例:create table dali.test1(a int,b int);
    create table dali.test2(a int,b int);insert into dali.test1 values(1,456);
    insert into dali.test1 values(2,427);
    insert into dali.test2 values(1,45456);
    insert into dali.test2 values(3,45656);---内连接
    select * from dali.test1 a, dali.test2 b where a.a=b.a;---左连接
    select * from dali.test1 a, dali.test2 b where a.a=b.a(+);---右连接
    select * from dali.test1 a, dali.test2 b where a.a(+)=b.a;---完全连接
    select * from dali.test1 a, dali.test2 b where a.a=b.a(+)
    union
    select * from dali.test1 a, dali.test2 b where a.a(+)=b.a;---迪卡尔
    select * from dali.test1, dali.test2;
      

  6.   

    你可以参考一下如下篇文章:
    http://www.firstsql.com/tutor3.htm#join