带表的SQL变得模棱两可

时间:2016-10-08 19:26:57

标签: postgresql

也许我接近这一切都是错的,在这种情况下,请随意指出一个更好的方法来解决整个问题,"我如何使用中间表进行未来的查询?&#34 ;

我们说我已经加入了foobar表,这些表加入了某些baz_id,我希望将它合并到一个中间表中被送入即将到来的查询。我知道WITH .. AS (...)声明,但我遇到了这样的问题:

WITH foobar AS (
    SELECT *
    FROM foo
    INNER JOIN bar ON bar.baz_id = foo.baz_id
)
SELECT
    baz_id
    -- some other things as well
FROM
    foobar

问题是(Postgres 9.4)告诉我baz_id is ambiguous。我理解这是因为SELECT *包含了两个表中的所有列,因此baz_id显示两次;但我不确定如何绕过它。我希望避免单独复制列名,比如

SELECT
    foo.var1, foo.var2, foo.var3, ...
    bar.other1, bar.other2, bar.other3, ...
FROM foo INNER JOIN bar ...

因为这些表中有数百列。

我是否有某种方法可以解决这个问题,或者采用一些完全不同的方式解决手头的问题?

1 个答案:

答案 0 :(得分:1)

WITH foobar AS (
    SELECT *
    FROM foo
    INNER JOIN bar USING(baz_id)
)
SELECT
    baz_id
    -- some other things as well
FROM
    foobar

它只在选择列表中留下baz_id列的一个实例。

From the documentation:

  

USING子句是一种速记,允许您利用连接两边对连接列使用相同名称的特定情况。它采用逗号分隔的共享列名列表,并形成一个连接条件,包括每个列的相等比较。例如,使用USING(a,b)连接T1和T2会产生连接条件ON T1.a = T2.a AND T1.b = T2.b。

     

此外,JOIN USING的输出会抑制冗余列:不需要打印两个匹配的列,因为它们必须具有相等的值。当JOIN ON生成T1中的所有列,后跟T2中的所有列时,JOIN USING为每个列出的列对(按列出的顺序)生成一个输出列,然后是T1中的任何剩余列,后跟T2中的所有剩余列