2013-07-23 53 views
1

我在Oracle數據庫這樣的情況:我有一個表稱爲CONNECTIONS持有兩個外鍵的物體表和連接的日期。其中連接成功,相關係統的訂單,所以連接我如何獲得基於兩列只是一個結果,其中值的順序確定唯一索引

OBJ1 | OBJ2 | DATE_CONN_MADE 
----------------------------- 
1 | 2 | 01/01/2000 

是從連接不同

OBJ1 | OBJ2 | DATE_CONN_MADE 
---------------------------- 
2 | 1 | 01/01/2000 

我的問題是:有,我可以得到一天的方式進行雙向連接。

相關一塊我的架構是

表對象:

ID | NAME

表中的連接

OBJ1 | OBJ2 | DATE_CONN_MADE

OBJ1和OBJ2的外鍵OBJECTS.ID

我想出了給我所有兩個日期的對連接的查詢

SELECT c.date_conn_made 
    FROM CONNECTIONS c 
WHERE ( c.obj1 = {parameter} 
      AND c.obj2 IN (SELECT c.obj1 
          FROM CONNECTIONS 
          WHERE c.obj2 = {parameter})) 
     OR ( c.obj2 = {parameter} 
      AND c.obj1 IN (SELECT c.obj2 
          FROM CONNECTIONS 
          WHERE c.obj1 = {parameter})); 

,但我想只得到更大的一個。

回答

1

關於CONNECTIONSSELF JOIN怎麼辦?這將提供所有可用的配對。

SELECT c1.date_conn_made, c1.obj1, c1.obj2, 
FROM CONNECTIONS c1 
JOIN CONNECTIONS c2 ON c1.date_conn_made = c2.date_conn_made 
         AND c1.obj1=c2.obj2 
         AND c2.obj1=c1.obj2; 

它假定您有興趣在同一日期進行雙向連接。它會對你有用嗎?

如果你想完成雙向連接時的日期(假設每個方向可以在同一天發生,那麼:

SELECT MAX(c1.date_conn_made), c1.obj1, c1.obj2, 
FROM CONNECTIONS c1 
JOIN CONNECTIONS c2 ON c1.obj1=c2.obj2 AND c2.obj1=c1.obj2 
GROUP BY c1.obj1, c1.obj2; 

所有上面的代碼是未經測試

+0

謝謝@ pm77-1你的回覆,自我加入解決了我的問題。我從來沒有想過走這條路。 我的確在尋找第二個連接(使對象之間的關係成爲雙向的連接)的那一天。實際上,如果他們是在同一天製造的,因爲日子會一樣,並且他們中的任何人都會爲我工作,如果他們不一樣,我只需要獲得更大的一個。 – HectorB

2

可以。真正做到這一點無需自連接,通過一個巧妙的方式使用聚集。

select least(obj1, obj2), greatest(obj1, obj2), max(date_conn_made) 
from connections 
group by least(obj1, obj2), greatest(obj1, obj2); 

採用least()greatest()把兩者objec按照相同的順序,不管原始方向如何。

相關問題