创建视图时在具有多个表的select语句中使用函数

时间:2018-11-14 02:10:41

标签: sql oracle

我正在使用创建视图工具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:“客户”。“姓氏”:无效的标识符

如何在我的select语句的那部分调用函数?我似乎找不到在涉及连接的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

但是,类似的东西对我也不起作用。我会很感激任何人能给我的帮助。

1 个答案:

答案 0 :(得分:1)

函数不是允许对其进行句号限定的表的属性。但是,其他对象之间的函数和表共享相同的名称空间。如docs中所述:

  

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

     
      
  • 表格
  •   
  • 观看次数
  •   
  • 序列
  •   
  • 私人同义词
  •   
  • 独立程序
  •   
  • 独立存储功能
  •   
  • 包裹
  •   
  • 材料化视图
  •   
  • 用户定义的类型
  •   

因此,只需隐式定义架构即可删除searchSvc = searchSvc.SortBy(elastic.NewFieldSort("created_at").Asc())限定符:

CUSTOMER.

或者,以以下方式显式限定所有表和函数对象上的模式名称:SELECT SALE.SaleID, SALE.SaleDate, LastNameFirst(LastName, FirstName) AS Customer_Name, ... "schema"."table"."column"

"schema"."function"