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
       ...        ...

我需要创建另一个视图,它将包含每个项目的收入百分比。问题是,我不知道如何将这一行从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
;
4

3 回答 3

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与逗号相同的 a ,因为它会产生笛卡尔积或变为inner joinifwhere子句。

 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是 aJOIN所以你有预期的括号((CROSS JOIN) JOIN )

于 2012-11-15T09:54:48.040 回答
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

于 2012-11-15T09:31:23.383 回答
0

“返回错误”对诊断问题没有帮助。我猜它说这t1.id_auto是一个无效的标识符。

混合旧的连接语法(子句中的多个逗号分隔的表和from子句中的连接条件where)和“新”语法joinand on)会令人困惑并且并不总是有效;无论如何,我建议始终使用“新”语法。

您可以使用 来执行此操作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

在视图之上构建视图并不总是一个好主意,并且可能会导致性能问题。

于 2012-11-15T09:56:08.340 回答