2017-10-12 74 views
0

我試圖從基於修訂號的各種表中提取數據,我只想查看小於主表中最小轉速的值,而且如果修訂版號不匹配或不可用我仍然希望看到空。如何將不匹配返回爲空值

T1 
Id t1_Value Rev 
1 ABC 123 
2 XYZ 234 
3 RTY 344 
4 MGH 678 

T2 
T2Id t1_Id(FK) t2_Value Rev 
1 1  ab12 121 
2 1  qw12 122 
3 2  rf45 234 
4 3  ty67 345 


Output: 
Id T1_Value T2_Value 
1 ABC  ab12 
1 ABC  qw12 
2 XYZ  rf45 
3 RTY 
4 MGH 

這裏是我的查詢的一部分:

select t1.id, t1.value as t1_value, t2.value as t2_value 
from t1, t2 
where t1.id=t2.t1_id(+) 
and nvl(t2.rev,-1)<=t1.rev 

如果我用NVL,它將返回#1,2,4。但我無法確定我們如何返回#3,我當前的查詢正在丟棄#3,所以我根本沒有看到#3的行。看到一些迴應後,我想補充說我的數據是跨多個表,我需要做這個修訂檢查< = t1.rev至少10個表。

回答

0

如果您對外連接使用ANSI(SQL標準)語法,那麼您會做得更好。

對於您正在使用的舊的,不推薦使用的專有Oracle語法,NVL不是您所需要的。

相反,你需要的(+)符號,從第二個表中有內容的每一個發生後 - 不只是一個時間的推移,在t2.t1_id(+),而且在第二個條件:

and t2.rev(+) <= t1.rev 
+0

但我可以外部多次加入同一個表嗎?我也有相同的版本號檢查其他表。 – Skn

+0

這個新問題與您在原文中提問的問題有何關係?然後:是的,您可以多次外連接到同一個表;但你怎麼做取決於你的問題。如果查詢比這更復雜,那麼您應該使用SQL標準語法DEFINITELY編寫外部連接(甚至Oracle至少在過去的20年中一直推薦!) – mathguy

+0

這不是新的,就像我在我的問題中提到的那樣,我正在提取多個表中的數據,而且我只在問題中列出了部分查詢。是的,我有所有表的修訂檢查,我有至少10個表,我需要檢查<= t1.rev – Skn

0

我相信你想:

select t1.id, t1.value as t1_value, t2.value as t2_value 
from t1 left join 
    t2 
    on t1.id = t2.t1_id and t2.rev <= t1.rev; 
+0

我試過這個,它的工作原理,但返回從t2的值,雖然t2.rev> t1.rev ,在這種情況下,我該如何返回空值? – Skn

+0

@Skn。 。 。你可能想使用'> ='。從你的問題中很難判斷你真正想要的是什麼。 –