我有2个观点:
VIEW5_SUMA
,它是一行,而且我需要“加入”VIEW4_SUMA_AUTA
SQL> SELECT * FROM VIEW5_SUMA ;
CELKOVA_TRZBA
-------------
5806
SQL> SELECT * FROM VIEW4_SUMA_AUTA ;
TRZBA_AUTA ID_AUTO
---------- ----------
360 1
... ...
我需要创建另一个视图,其中包含每个项目的收入百分比。问题是,我不知道如何“加入”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
;
答案 0 :(得分: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
,因为如果存在inner join
子句,它会生成笛卡尔积或更改为where
。
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 JOIN
是JOIN
,因此您有预期的括号((CROSS JOIN) JOIN )
答案 1 :(得分: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
来实现这一目标。
答案 2 :(得分:0)
'返回错误'对诊断问题没有帮助。我猜它说t1.id_auto
是无效的标识符。
混合old join syntax(from
子句中的多个逗号分隔表和where
子句中的连接条件)和'new' syntax(join
和on
)令人困惑,并不总是有效;我建议您始终使用' new'语法无论如何。
您可以使用join
执行此操作,但必须仅使用该表单。由于t1
和t3
之间没有联接条件,因此您需要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
在视图之上构建视图并不总是一个好主意,可能会导致性能问题。