我有一个返回SIM列表的查询。每个SIM都链接到一个客户。 SIM位于T_SIM表中,客户位于T_CUSTOMER表中。可以有多个SIM链接到单个客户。返回SIM卡时,它还会返回客户详细信息。
T_SIM表将有一个T_CUSTOMER表的前导键。
问题是:
在点#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的顺序不一样。
答案 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卡的最高记录。