2016-10-08 89 views
1

也許我正在接近這一切錯誤,在這種情況下可以隨意指出一個更好的方法來解決整個問題,其中「我如何使用中間表進行未來查詢?」SQL隨着表變得模糊

比方說,我有表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
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的所有剩餘列。

+0

完美的,正是我所需要的,也欣賞doc-quote! – dwanderson