2012-11-15 54 views
0

我有兩個觀點:選擇恆定值

  1. 查看VIEW5_SUMA包含價格的總和的所有項目(汽車),它是一個行,這是不變,我需要「加入」
  2. 查看VIEW4_SUMA_AUTA那包含所有收入用於特定項目(汽車)

SQL> SELECT * FROM VIEW5_SUMA ;

CELKOVA_TRZBA 
------------- 
     5806 

SQL> SELECT * FROM VIEW4_SUMA_AUTA ; 

TRZBA_AUTA ID_AUTO 
---------- ---------- 
     360   1 
     ...  ... 
的SUM

我需要創建另一個視圖,它將包含每個項目的收入百分比。問題是,我不知道如何「加入」從VIEW5_SUMA(總收入的常數)的一行到我的選擇,所以我可以用它來計算。

這是我走到這一步,但它返回的錯誤:剛剛發佈我的問題後

CREATE VIEW VIEW6 AS 
SELECT 
    t1.typ, 
    t1.specifikacia_typu, 
    t1.SPZ, 
    t2.trzba_auta/(t3.celkova_trzba/100) AS percenta 
FROM AUTA t1, VIEW5_SUMA t3 
JOIN VIEW4_SUMA_AUTA t2 ON t1.id_auto = t2.id_auto 
; 

回答

1

你看到的問題是由於在JOIN結合比逗號你寫了那麼什麼嚴格的事實是相當於

FROM AUTA t1, (VIEW5_SUMA t3 JOIN VIEW4_SUMA_AUTA t2 ON t1.id_auto = t2.id_auto) 

看到怎麼會有括號,這將不起作用裏面沒有表t1

這意味着所有你需要做的就是這樣的綁定工作,只要你想就可以改變其順序爲:

CREATE VIEW VIEW6 AS 
SELECT 
    t1.typ, 
    t1.specifikacia_typu, 
    t1.SPZ, 
    t2.trzba_auta/(t3.celkova_trzba/100) AS percenta 
FROM AUTA t1 JOIN VIEW4_SUMA_AUTA t2 ON t1.id_auto = t2.id_auto, 
VIEW5_SUMA t3 
; 

或者您可以使用一個CROSS JOIN這是同樣的事情,一個逗號,因爲它導致如果存在where條款,則在笛卡爾產品中或更改爲inner join

FROM AUTA t1 CROSS JOIN VIEW5_SUMA t3 JOIN VIEW4_SUMA_AUTA t2 ON (...) 

FROM AUTA t1 JOIN VIEW4_SUMA_AUTA t2 ON (...) CROSS JOIN VIEW5_SUMA t3 

CROSS JOINJOIN讓你有預期的括號((CROSS JOIN) JOIN)

0

哦,我找到了一個途徑。如果我根本不使用JOIN,而是在FROM中指定多個表格,然後使用WHERE連接表格。

SELECT 
    t1.typ, 
    t1.specifikacia_typu, 
    t1.SPZ, 
    t2.trzba_auta/(t3.celkova_trzba/100) AS percenta 
FROM AUTA t1, VIEW4_SUMA_AUTA t2, VIEW5_SUMA t3 
WHERE 
    t1.id_auto = t2.id_auto 
; 

但我還是好奇,如果有辦法與JOIN做到這一點。

0

「返回錯誤」不是診斷問題有所幫助。我猜它說t1.id_auto是一個無效的標識符。

混合的old join syntax(逗號隔開的多個表中的from子句中和where子句中的連接條件)和'new' syntaxjoinon)是混亂的,並且不總是工作;無論如何,我推薦始終使用'新'語法。

你可以用join來做到這一點,但你只能使用這種形式。由於t1t3之間沒有連接條件,因此您需要一個cross join。這產生了兩張表的笛卡爾乘積,這通常不是你想要的,但在這種情況下,因爲表中的一行有單行,所以似乎是合適的。

CREATE VIEW VIEW6 AS 
SELECT 
    t1.typ, 
    t1.specifikacia_typu, 
    t1.SPZ, 
    t2.trzba_auta/(t3.celkova_trzba/100) AS percenta 
FROM AUTA t1 
CROSS JOIN VIEW5_SUMA t3 
JOIN VIEW4_SUMA_AUTA t2 ON t1.id_auto = t2.id_auto 

在視圖之上構建視圖並不總是一個好主意,並且會導致性能問題。