连接到没有范围但需要范围的表

时间:2011-08-03 19:01:52

标签: sql oracle select oracle10g

尝试找到编写此SQL语句的最佳方法。

我有一个客户表,其中包含该客户的内部信用评分。然后我有另一张表,其中包含该信用评分的定义。我想将这些表连接在一起,但第二个表没有任何方法可以轻松链接它。

客户的分数是1-999之间的整数,定义表包含以下列:

Score
Description

这些行:

60   LOW
99   MED
999  HIGH

所以基本上如果一个客户得分在1到60之间,他们就是低,61-99他们是医学,100-999他们是高。

我无法真正加入这些内容,因为如果分数为60,99或999,它只会加入它们,这将排除其他人的分数。

我不想用静态数字做一个case语句,因为我们的分数将来可能会改变,而且我不想在/如果有的话更新我的初始查询。我也无法创建任何表或函数来执行此操作 - 我需要创建一个SQL语句来为我完成。

编辑:

一位同事说这会奏效,但有点疯狂。我认为必须有更好的方法:

SELECT 
  internal_credit_score
  (
    SELECT
      credit_score_short_desc
    FROM
      cf_internal_credit_score
    WHERE
      internal_credit_score = (
                                SELECT 
                                  max(credit.internal_credit_score) 
                                FROM 
                                  cf_internal_credit_score credit  
                                WHERE 
                                  cs.internal_credit_score <= credit.internal_credit_score
                                  AND credit.internal_credit_score <= (
                                                                        SELECT
                                                                          min(credit2.internal_credit_score)
                                                                        FROM
                                                                          cf_internal_credit_score credit2
                                                                        WHERE
                                                                          cs.internal_credit_score <= credit2.internal_credit_score
                                                                      )
                              )
  )
FROM 
  customer_statements cs

3 个答案:

答案 0 :(得分:3)

试试这个,更改你的表格以包含得分范围:

ScoreTable
-------------
LowScore int
HighScore int
ScoreDescription string

数据值

LowScore HighScore ScoreDescription 
-------- --------- ----------------
1        60        Low
61       99        Med
100      999       High

查询:

Select
    .... , Score.ScoreDescription 
    FROM YourTable
    INNER JOIN Score ON YourTable.Score>=Score.LowScore 
        AND YourTable.Score<=Score.HighScore
    WHERE ...

答案 1 :(得分:2)

假设您的表名为CreditTable,这就是您想要的:

select * from
(
    select Description, Score
    from CreditTable
    where Score > 80 /*client's credit*/
    order by Score
)
where rownum = 1

此外,请确保您的高分参考值为1000,即使客户的最高分数为999。

<强>更新

上面的SQL为您提供给定值的信用记录。如果你想加入,比如Clients表,你会做这样的事情:

select 
  c.Name,
  c.Score,
  (select Description from 
      (select Description from CreditTable where Score > c.Score order by Score)
   where rownum = 1)
from clients c

我知道这是为每个返回行执行的子选择,但是再次,CreditTable非常小,并且由于子选择的使用,不会有明显的性能损失。

答案 2 :(得分:1)

您可以使用分析函数将得分描述表中的数据转换为范围(我假设您的意思是100-999应该映射到'HIGH',而不是99-999)。

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2    select 60 score, 'Low' description from dual union all
  3    select 99, 'Med' from dual union all
  4    select 999, 'High' from dual
  5  )
  6  select description,
  7         nvl(lag(score) over (order by score),0) + 1 low_range,
  8         score high_range
  9*   from x
SQL> /

DESC  LOW_RANGE HIGH_RANGE
---- ---------- ----------
Low           1         60
Med          61         99
High        100        999

然后,您可以使用类似

的内容将其加入CUSTOMER表格
SELECT c.*, 
       sd.*
  FROM customer c,
       (select description,
               nvl(lag(score) over (order by score),0) + 1 low_range,
               score high_range
          from score_description) sd
 WHERE c.credit_score BETWEEN sd.low_range AND sd.high_range