如果失败,则从左外连接表中的一个返回行

时间:2015-10-13 09:02:05

标签: sql oracle

我想创建一个表作为这两个表的连接

Table A
[Entity]    [Name]    [Date]
   123        A     13/10/2015
   123        B     13/10/2015
   123        C     13/10/2015

Table B
[Entity]    [Name]    [Date]    [Price]          
  123         A     13/10/2015    10
  123         B     13/10/2015    15
  321         B     13/10/2015    15

我的要求是

CREATE TABLE c AS 
    SELECT  A.entity as Entity,
            A.Name as Name,
            A.Date as Date, 
            B.Price as Price
    FROM A
    LEFT JOIN B
        ON A.Entity = B.Entity
        AND A.Name = B.Name
        AND A.Date = B.Date

这很有效。我有以下结果

Table C
[Entity]    [Name]    [Date]    [Price]          
  123         A     13/10/2015    10
  123         B     13/10/2015    15

现在我想做同样的事情,但如果连接失败,还要保留表A中的行(并使用表B的默认值)。我期望的结果是(如果0是B.Price的默认值):

[Entity]    [Name]    [Date]    [Price]          
  123         A     13/10/2015    10
  123         B     13/10/2015    15
  123         C     13/10/2015    0

是否可以在单个SQL请求中执行此操作?还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

这是一个非常意外的结果,因为left join应保留A中存在但B中不存在的行。所以基本上,你只需要处理默认值,以防B中没有相应的值,pricenull例如,使用{ {1}}:

coalesce

SQLFiddle

答案 1 :(得分:1)

使用LEFT OUTER JOIN和Oracle NVL函数::

 CREATE TABLE c AS 
 SELECT  A.entity as Entity,
    A.Name as Name,
    A.Date as Date, 
    NVL(B.Price,0) as Price
 FROM A
 LEFT OUTER JOIN B
    ON A.Entity = B.Entity
    AND A.Name = B.Name
    AND A.Date = B.Date

希望它能为你效劳。