0

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 

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

4

3 回答 3

5

您可以在连接表时使用该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

于 2014-07-09T11:36:59.467 回答
2

我认为没有别名就无法做到这一点。“joined”查询的结果有两个字段,都名为 a_id。除非您为一个(或两个)别名,就像您在最终查询中所做的那样,外部查询不知道您指的是哪个 a_id。

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

于 2014-07-09T11:27:09.047 回答
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 *

于 2014-07-09T11:28:57.177 回答