Phi*_*hil 3 sql oracle oracle10g
我为想象中的律师创建了一个数据库,我最后一个完成的查询让我疯了.我需要弄清楚一位律师在他们的职业生涯中与公司所做的事情,我已经time_spent并且rate要加倍和特殊率来增加.(特价是公司合同的一次性费用,因此没有多少案例).我能想出的最好的是下面的代码.它按照我想要的方式行事,但只显示处理适用于特殊费率的案件的律师.
我基本上希望它在表中显示查询结果,即使特殊速率为NULL.
我已经订购了表格,以便首先显示最高金额,因此我可以使用ROWNUM仅显示前10%的收入者.
CREATE VIEW rich_solicitors AS
SELECT notes.time_spent * rate.rate_amnt + special_rate.s_rate_amnt AS solicitor_made,
notes.case_id
FROM notes,
rate,
solicitor_rate,
solicitor,
case,
contract,
special_rate
WHERE notes.solicitor_id = solicitor.solicitor_id
AND solicitor.solicitor_id = solicitor_rate.solicitor_id
AND solicitor_rate.rate_id = rate.rate_id
AND notes.case_id = case.case_id
AND case.contract_id = contract.contract_id
AND contract.contract_id = special_rate.contract_id
ORDER BY -solicitor_made;
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT *
FROM rich_solicitors
WHERE ROWNUM <= (SELECT COUNT(*)/10
FROM rich_solicitors)
Run Code Online (Sandbox Code Playgroud)
我怀疑你在示例查询中使用ROWNUM ...
Oracle9i +支持分析函数,如ROW_NUMBER和NTILE,使您的示例之类的查询更容易.分析也是ANSI,因此实现时语法是一致的(IE:不在MySQL或SQLite上).我重新写了你的查询:
SELECT x.*
FROM (SELECT n.time_spent * r.rate_amnt + COALESCE(spr.s_rate_amnt, 0) AS solicitor_made,
n.case_id,
NTILE(10) OVER (ORDER BY solicitor_made) AS rank
FROM NOTES n
JOIN SOLICITOR s ON s.solicitor_id = n.solicitor_id
JOIN SOLICITOR_RATE sr ON sr.solicitor_id = s.solicitor_id
JOIN RATE r ON r.rate_id = sr.rate_id
JOIN CASE c ON c.case_id = n.case_id
JOIN CONTRACT cntrct ON cntrct.contract_id = c.contract_id
LEFT JOIN SPECIAL_RATE spr ON spr.contract_id = cntrct.contract_id) x
WHERE x.rank = 1
Run Code Online (Sandbox Code Playgroud)
如果您是SQL新手,我建议使用ANSI-92语法.您的示例使用ANSI-89,它不支持OUTER JOIN并且被视为已弃用.我对SPECIAL_RATE表使用了LEFT OUTER JOIN,因为并非所有作业都可能附加特殊速率.
也不建议在视图中包含ORDER BY,因为视图封装了查询 - 没有人知道默认排序是什么,并且可能包括他们自己的(可能浪费资源).
| 归档时间: |
|
| 查看次数: |
1574 次 |
| 最近记录: |