Oracle SQL WITH子句选择加入列

时间:2014-07-09 11:20:44

标签: sql oracle join with-clause

SQL:

WITH joined AS (
    SELECT * 
    FROM table_a a 
    JOIN table_b b ON (a.a_id = b.a_id)
)
SELECT a_id 
FROM joined 

返回无效的标识符。

使用WITH子句时如何选择连接列?我尝试了别名,前缀和没有任何工作。我知道我可以使用:

WITH joined AS (
    SELECT a.a_id 
    FROM table_a a 
    JOIN table_b b ON (a.a_id = b.a_id)
)
SELECT a_id 
FROM joined

但是我需要这个别名来覆盖所有字段。

我设法满足这个条件的唯一方法是使用:

WITH joined AS (
    SELECT a.a_id a_id_alias, a.*, b.* 
    FROM table_a a 
    JOIN table_b b ON (a.a_id = b.a_id) 
)
SELECT a_id_alias 
FROM joined 

但这不是完美的解决方案......

3 个答案:

答案 0 :(得分:4)

您可以在加入表时使用USING子句的效果。

当您连接连接列具有相同名称的表时(就像您的示例一样),USING子句将仅返回连接列一次,因此以下工作:

with joined as (
  select *
  from table_a a 
    join table_b b using (a_id)
)
select a_id
from joined;

SQLFiddle示例:http://sqlfiddle.com/#!4/e7e099/2

答案 1 :(得分:2)

我认为没有别名就可以做到这一点。 “已加入”查询的结果有两个字段,都名为a_id。除非您在最终查询中使用别名(或两者),否则外部查询不知道您指的是哪个a_id。

为什么您的最终查询不是“完美”解决方案?

答案 2 :(得分:0)

您可以使用以下别名:

WITH JOINED AS (
    SELECT A.A_ID A_A_ID, B.A_ID B_A_ID,
    A.FIELD_NAME1 A_FIELDNAME1, A.FIELDNAME2 A_FIELDNAME2,A.FIELDNAME_N A_FIELDNAME_N,
    B.FIELD_NAME1 B_FIELDNAME1, B.FIELDNAME2 B_FIELDNAME2,B.FIELDNAME_N B_FIELDNAME_N,
    FROM TABLE_A A 
    JOIN TABLE_B B ON (A.A_ID = B.A_ID)
)
SELECT A_A_ID, B_A_ID
FROM JOINED 

使用SELECT *

始终是一个很好的做法