2014-09-06 2 views
0

я использую Oracle 10g PLSQL, мой запрос:ORA-00936: отсутствует выражение отличается от оракула

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 

Что такое правильный формат отчетливый в оракуле pl/sql? Я хочу вернуть все отличные значения "pkRentalId" и максимальное значение для всех остальных столбцов.

+0

Если вы хотите использовать 'DISTINCT', вам нужно сделать' DISTINCT' для каждого столбца в списке выбора. Я не уверен, что вы хотите использовать 'ON (« Аренда ».« PkRentalId »), но это недействительный синтаксис. –

+0

Я только хочу сделать отдельное предложение на одной из моих выбранных столбцов. что я должен делать в этом случае? google search рекомендует мне приведенный выше синтаксис. , как вы видите http://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-DISTINCT –

+0

Это ссылка на документацию PostgreSQL, а не на Oracle. Если в результате есть несколько строк в одном и том же 'pkRentalId', как вы знаете, какие из других значений вы хотите сохранить? –

ответ

1

Если вы хотите максимальное значение для каждого из других столбцов, вам нужно будет сделать GROUP BY, а не DISTINCT с агрегатной функцией max во всех остальных столбцах.

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" 

Теперь, с точки зрения требований, учитывая запрос у вас есть, это кажется необычным, хочет, чтобы получить максимальное значение для всех остальных столбцов. Это собирается смешивать данные из нескольких строк вместе так, как будто это не имеет смысла для меня.

+0

ORA-00979: не выражение GROUP BY приведенный выше запрос возвращает это мне –

+0

@KhurramZulfiqarAli - Вы уверены, что вы добавили агрегированную функцию в каждый столбец запроса, который вы не группируете? –

+0

пропущен один столбец. Ответил отмеченный! –

0

distinct on оператор из Postgres обычно переводится с помощью функции окна row_number() где «отдельные» столбцы используются для partition by части и order by используется для выбора строки вы хотите:

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 

Изменяя order by в определении окна вы можете выбрать, какую строку вы хотите («первая», «последняя», «третья»).

Разница в решении с использованием max() заключается в том, что он сохранит значения, которые принадлежат друг другу в одной строке.

Смежные вопросы