Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ORA-00936:oracle上缺少不同的表达式_Sql_Oracle10g_Distinct - Fatal编程技术网

Sql ORA-00936:oracle上缺少不同的表达式

Sql ORA-00936:oracle上缺少不同的表达式,sql,oracle10g,distinct,Sql,Oracle10g,Distinct,我正在使用oracle 10g plsql, 我的问题是: select DISTINCT ON("Rental"."pkRentalId") "pkRentalId", to_number("Reservation"."ReservationNo") "ReservationNo", to_char("Rental"."RentalNo") "RentalNo", to_char(segmentTable."Text"||'-'||rateTypeTable."Text

我正在使用oracle 10g plsql, 我的问题是:

select DISTINCT ON("Rental"."pkRentalId") "pkRentalId",
    to_number("Reservation"."ReservationNo") "ReservationNo",
    to_char("Rental"."RentalNo") "RentalNo",
    to_char(segmentTable."Text"||'-'||rateTypeTable."Text") "RateType",
    to_char("Debtor"."DebtorName") "DebtorName",
    to_char("Rates"."RateName") "RateName", 
    to_char("Renter"."FirstName"||' '||"Renter"."LastName") "Renter",
    to_date("Rates"."ValidFrom") "ValidFrom",
    to_date("Rates"."ValidTo") "ValidTo",
    round(to_number(to_number("ReservationDuration"."ExpectedCheckinDateTime"-"ReservationDuration"."DispatchDateTime") *to_number("Rates"."UnitRate")),2) "RentalAmount",
    to_number("Deductions"."Amount") "Deduction",
    to_number("Billing"."DiscountAmount") "Discount"
    from "Reservation" 
    inner join "Rental" on "Rental"."pkRentalId"="Reservation"."fkRentalId"
    inner join "Rates" on "Rates"."pkRateId"="Reservation"."fkRateId"
    inner join "Renter" on "Renter"."fkReservationId"="Reservation"."pkReservationId"
    inner join "Billing" on "Billing"."pkBillingId"="Reservation"."fkBillingId"
    inner join "Deductions" on "Deductions"."fkRentalId"="Rental"."pkRentalId"
    inner join "Debtor" on "Debtor"."pkDebtorId"="Rates"."fkDebtorId"
    inner join "EnumerationValue" segmentTable on segmentTable."pkEnumerationValueId"="Reservation"."fkSegmentId"
    inner join "EnumerationValue" rateTypeTable on rateTypeTable."pkEnumerationValueId"="Reservation"."fkRateTypeId"
    inner join "ReservationDuration" on "ReservationDuration"."pkDurationLocationId"="Reservation"."fkDurationId"
    where "Reservation"."IsDeleted"='N' 
它在回报我:

ORA-00936: missing expression
00936. 00000 -  "missing expression"
*Cause:    
*Action:
Error at Line: 4 Column: 17

oracle pl/sql中distinct on的正确格式是什么?我想返回所有的distinct
“pkRentalId”
值和所有其他列的最大值。

如果你想得到其他每列的最大值,你需要在所有其他列上使用
max
聚合函数执行
分组操作,而不是
distinct

select "Rental"."pkRentalId",
    max(to_number("Reservation"."ReservationNo")) "ReservationNo",
    max(to_char("Rental"."RentalNo")) "RentalNo",
    max(to_char(segmentTable."Text"||'-'||rateTypeTable."Text")) "RateType",
    max(to_char("Debtor"."DebtorName")) "DebtorName",
    max(to_char("Rates"."RateName")) "RateName", 
    max(to_char("Renter"."FirstName"||' '||"Renter"."LastName")) "Renter",
    max(to_date("Rates"."ValidFrom")) "ValidFrom",
    max(to_date("Rates"."ValidTo")) "ValidTo",
    max(round(to_number(to_number("ReservationDuration"."ExpectedCheckinDateTime"-"ReservationDuration"."DispatchDateTime") *to_number("Rates"."UnitRate")),2)) "RentalAmount",
    max(to_number("Deductions"."Amount")) "Deduction",
    max(to_number("Billing"."DiscountAmount")) "Discount"
  from ...
 where ...
 group by "Rental"."pkRentalId"

现在,从需求的角度来看,考虑到您的查询,想要获得所有其他列的最大值似乎是不寻常的。这将以一种对我来说似乎没有意义的方式将多行数据混合在一起。

Postgres中的
distinct on
操作符通常转换为使用窗口函数
row\u number()
,其中“distinct”列用于按
部分划分的
分区,而按
排序的
用于选择所需的行:

select *
from (
  select 
      row_number() over partition by ("Rental"."pkRentalId" order by "Reservation"."ReservationNo") as rn, 
      ... other columns 
  from "Reservation" 
     ... joins 
  where "Reservation"."IsDeleted"='N' 
) 
where rn = 1
通过更改窗口定义中的
顺序,可以选择所需的行(“第一行”、“最后一行”、“第三行”)


与使用
max()
的解决方案不同的是,它将保留属于同一行的值。

如果要使用
DISTINCT
,则需要对选择列表中的每一列执行
DISTINCT
。我不确定您想让(“Rent.”pkRentalId“
子句上的
做什么,但它的语法无效。我只想在我选择的一列上执行distinct子句。在这种情况下我该怎么办?谷歌搜索向我推荐上述语法。如您所见,这是指向PostgreSQL文档的链接,而不是Oracle。如果结果中有多行具有相同的
pkRentalId
,您如何知道要保留哪些其他值?@Justin您是对的。确切地如果结果集中有多行具有相同的
pkRentalId
值,您如何知道要保留哪些其他值?是否需要
min
值?
最大值是多少?还有什么?ORA-00979:不是上面查询返回的GROUPBY表达式me@KhurramZulfiqarAli-是否确实已在查询中未分组的每一列上添加了聚合函数?