【问题标题】:Using a function in a select statement with multiple tables while creating a view在创建视图时在具有多个表的 select 语句中使用函数
【发布时间】:2018-11-14 02:10:40
【问题描述】:

我正在使用 oracle SQL developer,创建视图工具。我有一个名为 LastNameFirst 的函数,我想用它来重新组织客户的名字/姓氏,以显示姓氏在前。

SELECT SALE.SaleID,SALE.SaleDate, CUSTOMER.LastNameFirst(LastName,FirstName), 
SALE_ITEM.SaleItemID,SALE_ITEM.ItemID,ITEM.ItemDescription, ITEM.ItemPrice

FROM SALE_ITEM
INNER JOIN SALE on SALE.SaleID = SALE_ITEM.SaleID
INNER JOIN ITEM on ITEM.ItemID = SALE_ITEM.ItemID
INNER JOIN CUSTOMER on CUSTOMER.CustomerID = SALE.CUSTOMERID;

我得到的错误是: ORA-00904: "客户"."LASTNAMEFIRST": 标识符无效

如何在我的 select 语句的那部分调用函数?除了以某种方式使用“交叉应用”或“外部应用”之外,我似乎找不到在涉及连接的选择语句中调用函数的任何示例。我理解(我认为)语法是

SELECT 'tableName'.'columnName'

而且我知道我的函数不是列,这就是我收到该错误的原因。但我真的不确定如何设置代码。我尝试将其更改为:

SELECT SALE.SaleID,SALE.SaleDate,CUSTOMER.LastName, CUSTOMER.FirstName AS LastNameFirst(LastName,FirstName),SALE_ITEM.SaleItemID,SALE_ITEM.ItemID,ITEM.ItemDescription, ITEM.ItemPrice

但这样的事情对我也没有任何作用。我会很感激任何人能给我的帮助。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    函数不是表的属性,不能用句号限定它们。但是,其他对象中的函数和表共享相同的命名空间。正如docs中提到的:

    以下架构对象共享一个命名空间:

    • 表格
    • 观看次数
    • 序列
    • 私人同义词
    • 独立程序
    • 独立的存储函数
    • 实体化视图
    • 用户定义类型

    因此,只需删除 CUSTOMER. 限定符,因为架构是隐式定义的:

    SELECT SALE.SaleID, 
           SALE.SaleDate, 
           LastNameFirst(LastName, FirstName) AS Customer_Name, ...
    

    或者,以"schema"."table"."column""schema"."function" 的方式明确限定所有表和函数对象的架构名称:

    SELECT myschema.SALE.SaleID, 
           myschema.SALE.SaleDate, 
           myschema.LastNameFirst(myschema.CUSTOMER.LastName, 
                                  myschema.CUSTOMER.FirstName) AS Customer_Name, ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-06
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      相关资源
      最近更新 更多