2016-11-07 20 views
6

tôi có một cái nhìn như thế này:Oracle: VLOOKUP tương đương

col_1 col_2 my_date 
----- ----- ------- 
1  5  2011 
2  6  2014 
3  7  2012 
4  8  2011 

Và một bảng như thế này:

date_1 date_2 the_value 
------ ------ --------- 
2010 2012 v1 
2013 2015 v2 

Tôi muốn một cái gì đó giống như chức năng Excel VLOOKUP đó tìm giá trị (the_value) mà my_date là giữa date_1date_2, vì vậy tôi có thể có một kết quả như thế này:

col_1 col_2 my_date the_value 
----- ----- ------- --------- 
1  5  2011  v1 
2  6  2014  v2 
3  7  2012  v1 
4  8  2011  v1 

Loại cột ngày là DATE. Đây là những dữ liệu mẫu cho sự đơn giản.

+0

Tại sao bạn không sử dụng giữa khoản bằng cách tham gia hai bảng này? – Buddi

+0

Bạn có thể tham gia hai bảng này vào "my_date giữa date_1 và date_2", tuy nhiên có thể sao chép các hàng của bạn. Nếu bạn muốn hoạt động chính xác của vlookup, bạn có thể nhóm theo các cột trong bảng đầu tiên của bạn và sử dụng First_Value (the_value) bạn đã thử không? –

Trả lời

8

Đó là tham gia vào SQL với một số between hơn là điều kiện tham gia bình đẳng.

select t1.col_1, t1.col_2, t1.my_date, t2.the_value 
from table_one t1 
    join table_two t2 on t1.my_date between t2.date_1 and t2.date_2; 

Lưu ý rằng betweenbao gồm ranh giới vì vậy nó cũng sẽ trở lại hàng nơi my_date2010. Nếu bạn không muốn điều đó bạn cần phải sử dụng một điều kiện tham gia với ><:

select t1.col_1, t1.col_2, t1.my_date, t2.the_value 
from table_one t1 
    join table_two t2 on t1.my_date > t2.date_1 
        and t1.my_date < t2.date_2; 

này cũng đòi hỏi "ngày" của bạn dao động là không chồng chéo, nếu không bạn sẽ nhận được một số kết quả kỳ lạ.

2

Bạn có thể sử dụng một truy vấn liên quan để lấy giá trị:

SELECT t.*, 
     (SELECT s.the_value FROM t2 s 
     WHERE t.my_date between s.date_1 and s.date_2) as the_value 
FROM t1 t 
Các vấn đề liên quan