【问题标题】:Table alias is not recognized in subquery Oracle子查询 Oracle 中无法识别表别名
【发布时间】:2016-09-16 14:39:50
【问题描述】:

我有带有 LEFT JOIN 的 SELECT 语句,并且连接的表是子查询。并且 Oracle 无法识别第二个子查询中第一个子查询的别名。它适用于 DB2,但不适用于 Oracle。 我如何实现它或重写我的查询?

SELECT *                  
 FROM                                                      
 (SELECT     E.C3 AS  COLUMN3        
    , E.C4 AS  COLUMN4        
   FROM TBL_1 D                            
    , TBL_2 E                            
WHERE D.C6  =  E.C6 ) B                                                              
LEFT  JOIN  TABLE   
(SELECT  C.C1                          
 FROM    TBL_3  C                   
 WHERE                                                  
 C.C7            = 'hello'      
 AND B.C3            = C.C8                            
UNION ALL                                                 
 SELECT  C.C1                          
    FROM    TBL_3  C                
    WHERE                                               
    C.C7          = 'world'      
    AND B.C4          =  C.C8                       
    )            A               
ON 1 = 1

Oracle 错误信息: ORA-00904: "B"."C3": 无效标识符

【问题讨论】:

  • 我不了解 DB2,但这看起来像 SQL Server 的 CROSS/OUTER APPLY 或 PostgreSQL/标准 SQL 的 JOIN LATERAL。检查这是否有帮助:oracle-base.com/articles/12c/…
  • 您得到的确切的 ORA- 错误消息是什么?

标签: sql oracle join subquery alias


【解决方案1】:

您可以将此查询简化为以下内容,删除子查询:

Select      A.Col1, B.Col2
From        tbl_AJoin   A
Left Join   tbl_BJoin   B   On  A.col1 = B.col1

【讨论】:

  • 非常感谢您的回复。但我的查询并不是那么简单。我的问题中只有一个简化的示例。我想无法按照您建议的方式简化真正的查询。可能你有其他想法吗?我试图用 WITH 子句重写它,并使用 Oracle (+) JOIN 表示,但这对我没有帮助
  • 也许,如果您在问题中提供的查询解决方案对您没有帮助,也许您需要更新示例查询以更准确地反映您的实际查询。有点像在真正尝试修理摩托车时询问机械师如何修复自行车故障......为什么不直接询问如何修理摩托车?!
  • 很抱歉给您带来不便。我已经编辑了我的查询
【解决方案2】:

您有语法错误。这个:

select * from (select col1 from tbl_Ajoin) A
left join table (select col2 from tbl_Bjoin where A.col1 = tbl_Bjoin.col1) B     
ON 1 = 1

应该是这样的:

select * from (select col1 from tbl_Ajoin) A
left join (select col2 from tbl_Bjoin where A.col1 = tbl_Bjoin.col1) B     
ON 1 = 1

或者更具体地说,这个:

left join table (select

不应包含单词table。应该是这样的:

left join (select

【讨论】:

  • 感谢您的提及。但是根据 sql 规则,提供的示例是正确的,并且适用于 DB2。我认为删除“表”不会影响解决我关于子查询的问题
  • @WalentynaJuszkiewicz 您希望 table 关键字应该达到什么效果?
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
相关资源
最近更新 更多