2015-03-27 11 views
0

У меня есть запрос, который возвращает список SIM-карт. Каждая SIM-карта связана с клиентом. SIM-карты находятся в таблице T_SIM, а клиенты находятся в таблице T_CUSTOMER. Между одним клиентом может быть более одной SIM-карты. При возврате SIM-карт он также возвращает информацию о клиенте.данные не получены в том же порядке

Таблица T_SIM будет иметь ключ переднего края таблицы T_CUSTOMER.

Этот вопрос:

  1. Сначала выполнить запрос, потребовав 100 лучших записей, делая заказ CUSTOMER_CODE в порядке возрастания.
  2. Теперь запустите тот же запрос, запросив 1000 записей, выполнив заказ CUSTOMER_CODE в порядке возрастания.

Здесь, в пункте №2, в результатах 1000 записей первые 100 записей не такие же, как в пункте № 1. Записи перепутались. Порядок не согласован.

Чтобы решить эту проблему, я использовал ROWID вместе с заказом CUSTOMER_CODE.

Но решение не принято клиентом.

Не могли бы вы предложить любую другую альтернативу для решения проблемы. Тип данных CUSTOMER_CODE является VARCHAR2

Ниже приведен запрос:

SELECT TT.SIM_ID, 
    TT.IMSI, 
    TT.MSISDN, 
    TT.SECONDARY_MSISDN, 
    TT.CUSTOMER_ID, 
    TT.SIM_STATE, 
    TCU.CUSTOMER_CODE 
FROM T_SIM TT 

LEFT OUTER JOIN T_CUSTOMER TCU 
ON TT.CUSTOMER_ID = TCU.CUSTOMER_ID 

WHERE 1 = 1 
AND TT.SIM_ID IN 
    (SELECT SIM_ID 
    FROM 
    (SELECT * 
    FROM 
     (SELECT Z.*, 
     ROWNUM RNUM 
     FROM 
     (SELECT TT.SIM_ID 
     FROM T_SIM TT 
     LEFT OUTER JOIN T_CUSTOMER TCU 
     ON TT.CUSTOMER_ID = TCU.CUSTOMER_ID 
     WHERE 1   =1 
     ORDER BY TCU.CUSTOMER_CODE ASC 
     ) Z 
     WHERE ROWNUM <= 1000 
    ) 
    WHERE RNUM >= 0 
    ) 
) 
ORDER BY TCU.CUSTOMER_CODE ASC 

Результат в обоих случаях делается заказ по CUSTOMER_CODE но SIMS, принадлежащие к ним не идут в том же порядке.

+1

ли ваш код клиента 'VARCHAR2' или' NUMBER' – Exhausted

+0

@ Вычеркнуто Это не должно иметь значения, оно должно быть последовательным. – Barmar

+0

Пожалуйста, разместите полный запрос, который вы используете. – Barmar

ответ

0

Проблема заключается в том, что сначала вы ограничиваете количество строк при выборе из t_sim (поэтому их выбирают случайным образом), и именно тогда вы заказываете свой результат. Так что вы должны сделать, это удалить ROWNUM < 1000 из внутреннего запроса и поставить его на самом высоком уровне, как это:

select * from 
(TT.SIM_ID, 
    TT.IMSI, 
    TT.MSISDN, 
    TT.SECONDARY_MSISDN, 
    TT.CUSTOMER_ID, 
    TT.SIM_STATE, 
    TCU.CUSTOMER_CODE 
FROM T_SIM TT 

LEFT OUTER JOIN T_CUSTOMER TCU 
ON TT.CUSTOMER_ID = TCU.CUSTOMER_ID 

WHERE 1 = 1 
AND TT.SIM_ID IN 
    (SELECT SIM_ID 
    FROM 
    (SELECT * 
    FROM 
     (SELECT Z.*, 
     ROWNUM RNUM 
     FROM 
     (SELECT TT.SIM_ID 
     FROM T_SIM TT 
     LEFT OUTER JOIN T_CUSTOMER TCU 
     ON TT.CUSTOMER_ID = TCU.CUSTOMER_ID 
     WHERE 1   =1 
     ORDER BY TCU.CUSTOMER_CODE ASC 
     ) Z 
    ) 
    WHERE RNUM >= 0 
    ) 
) 
ORDER BY TCU.CUSTOMER_CODE ASC 
) where rownum<1000 

Потому что сначала вы хотите сделать полный упорядоченный набор результатов и только затем дисплей 1000 верхние записи сим-карт, заказанных по customer_code.

+0

также я не упомянул об этом в своем ответе, но что такое поэт устанавливая условие rnum> = 0? не имеет смысла для меня – Martina

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