1

我的 oracle 数据库中有这种情况:我有一个名为CONNECTIONS的表,其中包含OBJECTS表的两个外键和建立连接的日期。建立连接的顺序与系统相关,因此连接

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}));

这给了我这对连接的所有两个日期,但我希望只得到更大的一个。

4

2 回答 2

2

通过巧妙地使用聚合,您实际上可以在没有自连接的情况下做到这一点。

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

使用least()greatest()放置两个对象的顺序相同,与原始方向无关。

于 2013-07-24T01:14:55.030 回答
1

SELF JOIN上呢CONNECTIONS?这将提供所有可用的对。

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;

以上所有代码均未经测试。

于 2013-07-23T17:07:45.147 回答