2017-07-06 48 views
0

我有3个不同的数据集的Oracle SQL子查询链接多个表

数据1:

ID Rank_down 
1 
2 
3 

数据2:

ID From To 
1 AB  CD 
2 EF  JK 
3 PQ PQ 

数据3:

From/To rank 
    AB  1 
    CD  2 
    EF  3 
    JK  5 
    PQ  9 

我需要填充字段rank_down为Y/N ba根据ID是否已经从较高级别移动到较低级别(1是最低级别)。这必须在Oracle SQl中完成。我对这个编程很陌生,因此很难编写子查询。

任何人都可以帮忙吗?

+0

没有时间/顺序为您rank_down定义。订单没有在表格中定义,所以我们如何知道如何对数据进行排序3,以便我们可以获得正确的排名?根据您的样本数据定义一些预期结果以帮助确认。因此,ID 1应该从1到2排在第一位,ID 2从3到5就是Y? ID 3为空,因为它没有移动? – xQbert

+0

在data3中不保证订单。我们如何知道按照什么顺序放置这些;以便队伍和从/上下适合排名? – xQbert

+0

然后它不能完成。由于表3中的数据顺序不能保证,所以我们可以看到CD,2然后是AB,1。在这种情况下,rank_down将是N还是您如何定义订单的排名?并且AB和CD定义了向上/向下? PQ会是什么? – xQbert

回答

0

我只是没有下,所以我会尝试一些SQL,看看这个我们更加接近......

这是否选择放弃在选择时尚预期的效果? (我可能有Y/N的倒置)

SELECT ID, Case when D3a.Rank < D3b.Rank then 'N' 
       when D3a.Rank > D3b.Rank then 'Y' 
       when D3a.Rank = D3b.Rank then 'N' 
       end as Rank_down 
FROM data2 D2 
INNER JOIN data3 D3a 
on D3a.From_To = D2.From 
INNER JOIN data3 D3b 
on D3b.From_To = D2.To 

如果是这样,我们只需要根据它进行更新。

UPDATE Data1 d1 
INNER JOIN ( SELECT ID, Case when D3A.Rank < D3b.Rank then 'N' 
        when D3A.Rank > D3B.Rank then 'Y' 
        when D3A.Rank = D3B.Rank then 'N' 
        end as Rank_down 
    FROM data2 D2 
    INNER JOIN data3 D3a 
    on D3a.From_To = D2.From 
    INNER JOIN data3 D3b 
    on D3B.From_To = D2.To) B 
on B.ID = d1.ID 
set d1.Rank_down = B.Rank_Down 
1

尝试:

select t.*, 
     CASE WHEN 
      (SELECT "RANK" FROM DATA_3 d 
      WHERE d.From_To = t."FROM" 
      ) 
      > 
      (SELECT "RANK" FROM DATA_3 d 
      WHERE d.From_To = t."TO" 
      ) 
     THEN 'Y' ELSE 'N' END 
     As rank_down 
from data_2 t;