Saturday, May 21, 2011

Rownum Oracle

Today when creating a view I kept getting the following error:
SQL Error: ORA-00998: must name this expression with a column alias


My view was something like this:

CREATE OR REPLACE VIEW PROTOCOL_SEGMENT_INFO_VIEW AS 
SELECT ROWNUM, T.SEGMENT_ID, T.PROTOCOL_NUMBER, T.PROTOCOL_ID_PREFIX, T.PROTOCOL_ID_SUFFIX, T.MODIFIED_DATE FROM
(
SELECT ANIMAL_REQ_ORDER.SEGMENT_ID,
    PROTOCOL.PROTOCOL_NUMBER,
    PROTOCOL.PROTOCOL_ID_PREFIX,
    PROTOCOL.PROTOCOL_ID_SUFFIX,
    ANIMAL_SHIPMENT.RECEIVED_DATE MODIFIED_DATE
  FROM ANIMAL_SHIPMENT
  JOIN ANIMAL_DELIVERY ON ANIMAL_DELIVERY.ANIMAL_DELIVERY_ID = ANIMAL_SHIPMENT.ANIMAL_DELIVERY_ID
  JOIN ANIMAL_REQ_ORDER ON ANIMAL_REQ_ORDER.ANIMAL_REQ_ORDER_ID = ANIMAL_DELIVERY.ANIMAL_REQ_ORDER_ID
  JOIN SEGMENT ON SEGMENT.SEGMENT_ID = ANIMAL_REQ_ORDER.SEGMENT_ID
  JOIN EFFECTIVE_PROTOCOL_VIEW EPV ON EPV.PROTOCOL_ID = SEGMENT.PROTOCOL_ID
  JOIN PROTOCOL ON PROTOCOL.PROTOCOL_ID = EPV.EFFECTIVE_PROTOCOL_ID
UNION 
SELECT  CENSUS_TRANSACTION.SEGMENT_ID,
    PROTOCOL.PROTOCOL_NUMBER,
    PROTOCOL.PROTOCOL_ID_PREFIX,
    PROTOCOL.PROTOCOL_ID_SUFFIX,
    CENSUS_TRANSACTION.CENSUS_DATETIME MODIFIED_DATE
  FROM CENSUS_TRANSACTION
 JOIN SEGMENT ON SEGMENT.SEGMENT_ID = CENSUS_TRANSACTION.SEGMENT_ID
  JOIN EFFECTIVE_PROTOCOL_VIEW EPV ON EPV.PROTOCOL_ID = SEGMENT.PROTOCOL_ID
  JOIN PROTOCOL ON PROTOCOL.PROTOCOL_ID = EPV.EFFECTIVE_PROTOCOL_ID
UNION
SELECT SEGMENT.SEGMENT_ID,
    PROTOCOL.PROTOCOL_NUMBER,
    PROTOCOL.PROTOCOL_ID_PREFIX,
    PROTOCOL.PROTOCOL_ID_SUFFIX,
    PROTOCOL_ACCOUNT.CREATED_DATETIME MODIFIED_DATE
FROM PROTOCOL_ACCOUNT
JOIN EFFECTIVE_PROTOCOL_VIEW EPV ON EPV.PROTOCOL_ID = PROTOCOL_ACCOUNT.PROTOCOL_ID
JOIN PROTOCOL ON PROTOCOL.PROTOCOL_ID = EPV.EFFECTIVE_PROTOCOL_ID
JOIN SEGMENT ON SEGMENT.PROTOCOL_ID = PROTOCOL.PROTOCOL_ID
  ) T;


well after a lot of playing around, I realized that it was really the rownum within the view that was missing an alias. So here is what it really should have been:



CREATE OR REPLACE VIEW PROTOCOL_SEGMENT_INFO_VIEW AS 
SELECT ROWNUM ROWNUMBER, T.SEGMENT_ID, T.PROTOCOL_NUMBER, T.PROTOCOL_ID_PREFIX, T.PROTOCOL_ID_SUFFIX, T.MODIFIED_DATE FROM
(
SELECT ANIMAL_REQ_ORDER.SEGMENT_ID,
    PROTOCOL.PROTOCOL_NUMBER,
    PROTOCOL.PROTOCOL_ID_PREFIX,
    PROTOCOL.PROTOCOL_ID_SUFFIX,
    ANIMAL_SHIPMENT.RECEIVED_DATE MODIFIED_DATE
  FROM ANIMAL_SHIPMENT
  JOIN ANIMAL_DELIVERY ON ANIMAL_DELIVERY.ANIMAL_DELIVERY_ID = ANIMAL_SHIPMENT.ANIMAL_DELIVERY_ID
  JOIN ANIMAL_REQ_ORDER ON ANIMAL_REQ_ORDER.ANIMAL_REQ_ORDER_ID = ANIMAL_DELIVERY.ANIMAL_REQ_ORDER_ID
  JOIN SEGMENT ON SEGMENT.SEGMENT_ID = ANIMAL_REQ_ORDER.SEGMENT_ID
  JOIN EFFECTIVE_PROTOCOL_VIEW EPV ON EPV.PROTOCOL_ID = SEGMENT.PROTOCOL_ID
  JOIN PROTOCOL ON PROTOCOL.PROTOCOL_ID = EPV.EFFECTIVE_PROTOCOL_ID
UNION 
SELECT  CENSUS_TRANSACTION.SEGMENT_ID,
    PROTOCOL.PROTOCOL_NUMBER,
    PROTOCOL.PROTOCOL_ID_PREFIX,
    PROTOCOL.PROTOCOL_ID_SUFFIX,
    CENSUS_TRANSACTION.CENSUS_DATETIME MODIFIED_DATE
  FROM CENSUS_TRANSACTION
 JOIN SEGMENT ON SEGMENT.SEGMENT_ID = CENSUS_TRANSACTION.SEGMENT_ID
  JOIN EFFECTIVE_PROTOCOL_VIEW EPV ON EPV.PROTOCOL_ID = SEGMENT.PROTOCOL_ID
  JOIN PROTOCOL ON PROTOCOL.PROTOCOL_ID = EPV.EFFECTIVE_PROTOCOL_ID
UNION
SELECT SEGMENT.SEGMENT_ID,
    PROTOCOL.PROTOCOL_NUMBER,
    PROTOCOL.PROTOCOL_ID_PREFIX,
    PROTOCOL.PROTOCOL_ID_SUFFIX,
    PROTOCOL_ACCOUNT.CREATED_DATETIME MODIFIED_DATE
FROM PROTOCOL_ACCOUNT
JOIN EFFECTIVE_PROTOCOL_VIEW EPV ON EPV.PROTOCOL_ID = PROTOCOL_ACCOUNT.PROTOCOL_ID
JOIN PROTOCOL ON PROTOCOL.PROTOCOL_ID = EPV.EFFECTIVE_PROTOCOL_ID
JOIN SEGMENT ON SEGMENT.PROTOCOL_ID = PROTOCOL.PROTOCOL_ID
  ) T;

No comments: