选择常量值

时间:2012-11-15 09:26:23

标签: oracle select constants

我有2个观点:

  1. 查看包含所有商品(汽车)价格总和的VIEW5_SUMA,它是一行,而且我需要“加入”
  2. 查看包含特定商品(汽车)所有收入的总和的VIEW4_SUMA_AUTA
  3. 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
    ;
    

3 个答案:

答案 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 JOINJOIN,因此您有预期的括号((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 syntaxfrom子句中的多个逗号分隔表和where子句中的连接条件)和'new' syntaxjoinon)令人困惑,并不总是有效;我建议您始终使用' new'语法无论如何。

您可以使用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

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