数据未按相同顺序检索

时间:2015-03-27 10:21:32

标签: oracle sql-order-by

我有一个返回SIM列表的查询。每个SIM都链接到一个客户。 SIM位于T_SIM表中,客户位于T_CUSTOMER表中。可以有多个SIM链接到单个客户。返回SIM卡时,它还会返回客户详细信息。

T_SIM表将有一个T_CUSTOMER表的前导键。

问题是:

  1. 首先通过按CUSTOMER_CODE按升序排序来请求前100条记录来运行查询。
  2. 现在通过按CUSTOMER_CODE按升序排序请求前1000条记录来运行相同的查询。
  3. 在点#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 个答案:

答案 0 :(得分:0)

问题是,从t_sim中选择时,首先要限制行数(因此这些是随机选择的),然后您就是在命令输出。 所以你应该做的是从内部查询中删除ROWNUM&lt; 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

首先,您要制作完整的有序结果集,然后显示由customer_code订购的1000张SIM卡的最高记录。