Hi,
I have the following UNION which it is returning rows ordered by the first column from select. I need to know why Oracle does this because the output should be other.
Currently I get something like
1
2
3
4
5
6
and I should get something like
6
5
4
1
2
3
Code:
((SELECT *
FROM (SELECT TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_ID,
TAPE_MOVEMENT_ACTIONS_VW1.BOX_NUMBER,
TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_NAME,
TAPE_MOVEMENT_ACTIONS_VW1.LOCATION,
TAPE_MOVEMENT_ACTIONS_VW1.KIND,
TAPE_MOVEMENT_ACTIONS_VW1.DEVICE,
TAPE_MOVEMENT_ACTIONS_VW1.TAPE_ISSUE,
TAPE_MOVEMENT_ACTIONS_VW1.CONTENT_DESCRIPTION,
TAPE_MOVEMENT_ACTIONS_VW1.AVAILABLE_CODE,
TAPE_MOVEMENT_ACTIONS_VW1.LIBRARY_LOCATION,
TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_NOTES,
TAPE_MOVEMENT_ACTIONS_VW1.MEDIA_VERSION,
TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_STATUS,
TAPE_MOVEMENT_ACTIONS_VW1.RESPONSIBILITY_OF--,
--TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_ID F0
FROM TAPE_MOVEMENT_ACTIONS_VW TAPE_MOVEMENT_ACTIONS_VW1
WHERE ((((((TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_ID > :V_1) AND
(TAPE_MOVEMENT_ACTIONS_VW1.AVAILABLE_CODE = :V_2))) AND
(TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_ID < :V_3))))
ORDER BY TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_ID DESC)
WHERE ROWNUM <= :V_ROW_NUM) UNION
(SELECT *
FROM (SELECT TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_ID,
TAPE_MOVEMENT_ACTIONS_VW1.BOX_NUMBER,
TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_NAME,
TAPE_MOVEMENT_ACTIONS_VW1.LOCATION,
TAPE_MOVEMENT_ACTIONS_VW1.KIND,
TAPE_MOVEMENT_ACTIONS_VW1.DEVICE,
TAPE_MOVEMENT_ACTIONS_VW1.TAPE_ISSUE,
TAPE_MOVEMENT_ACTIONS_VW1.CONTENT_DESCRIPTION,
TAPE_MOVEMENT_ACTIONS_VW1.AVAILABLE_CODE,
TAPE_MOVEMENT_ACTIONS_VW1.LIBRARY_LOCATION,
TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_NOTES,
TAPE_MOVEMENT_ACTIONS_VW1.MEDIA_VERSION,
TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_STATUS,
TAPE_MOVEMENT_ACTIONS_VW1.RESPONSIBILITY_OF--,
--TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_ID F0
FROM TAPE_MOVEMENT_ACTIONS_VW TAPE_MOVEMENT_ACTIONS_VW1
WHERE ((((((TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_ID > :V_4) AND
(TAPE_MOVEMENT_ACTIONS_VW1.AVAILABLE_CODE = :V_5))) AND
((TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_ID >= :V_6) OR
TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_ID IS NULL))))
ORDER BY TAPE_MOVEMENT_ACTIONS_VW1.PHYSICAL_MEDIA_ID ASC)
WHERE ROWNUM <= :V_ROW_NUM))
Execution plan is:
Code:
Plan
SELECT STATEMENT ALL_ROWSCost: 121,342 Bytes: 94,689 Cardinality: 21 Partition #: 0
10 SORT UNIQUE Cost: 121,342 Bytes: 94,689 Cardinality: 21 Partition #: 0
9 UNION-ALL Cost: 0 Bytes: 0 Cardinality: 0 Partition #: 0
4 COUNT STOPKEY Cost: 0 Bytes: 0 Cardinality: 0 Partition #: 0
3 VIEW ONAIR. Cost: 1 Bytes: 4,509 Cardinality: 1 Partition #: 0
2 TABLE ACCESS BY INDEX ROWID ONAIR.PHYSICAL_MEDIA Cost: 1 Bytes: 51 Cardinality: 1 Partition #: 0
1 INDEX RANGE SCAN DESCENDING ONAIR.QQ_CRS1234 Cost: 1 Bytes: 0 Cardinality: 1 Partition #: 0
8 COUNT STOPKEY Cost: 0 Bytes: 0 Cardinality: 0 Partition #: 0
7 VIEW ONAIR. Cost: 107 Bytes: 582,188,553 Cardinality: 129,117 Partition #: 0
6 TABLE ACCESS BY INDEX ROWID ONAIR.PHYSICAL_MEDIA Cost: 107 Bytes: 6,584,967 Cardinality: 129,117 Partition #: 0
5 INDEX RANGE SCAN ONAIR.QQ_CRS1234 Cost: 7 Bytes: 0 Cardinality: 129,117 Partition #: 0
Thanks for your help
Sorry for the thread title I forgot to edit it should be "How rows are ordered into an union statement"