也许我接近这一切都是错的,在这种情况下,请随意指出一个更好的方法来解决整个问题,"我如何使用中间表进行未来的查询?&#34 ;
我们说我已经加入了foo
和bar
表,这些表加入了某些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 ...
因为这些表中有数百列。
我是否有某种方法可以解决这个问题,或者采用一些完全不同的方式解决手头的问题?
答案 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
列的一个实例。
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中的所有剩余列