table 1
---
id , name
table2
---
id , activity, datefield
table1'右连接'table2将从右表(table2)返回多于1个结果。如何使得只返回具有最高日期的table2的“1”结果
答案 0 :(得分:3)
你写的关于你的问题的信息很差,但我会试着举个例子来帮助你。
您有一个表“A”和一个表“B”,您需要获取与表“A”相关的表“B”的“顶部”日期
示例表:
Table A:
AID| NAME
----|-----
1 | Foo
2 | Bar
Table B:
BID | AID | DateField
----| ----| ----
1 | 1 | 2000-01-01
2 | 1 | 2000-01-02
3 | 2 | 2000-01-01
如果你这样做:
SELECT * FROM A RIGHT JOIN B ON B.ID = A.ID
您可以获得与ID相关的A和B的所有信息(在此理论情况下,这两个表通常用于链接关系的字段)
A.AID | A.NAME | B.BID | B.AID | B.DateField
------|--------|-------|-------|--------------
1 | Foo | 1 | 1 | 2000-01-01
1 | Foo | 2 | 1 | 2000-01-02
2 | Bar | 3 | 2 | 2000-01-01
但是您只需要表A中每个元素的最后日期(B的最高日期)
接下来,如果您只需要获得最高日期,则需要按B.AID对查询进行分组,并仅获取最高日期
SELECT
B.AID, First(A.NAME), MAX(B.DateField)
FROM
A RIGHT JOIN B ON B.ID = A.ID
GROUP BY
B.AID
此操作的结果是:
B.AID | A.NAME | B.DateField
------|--------|--------------
1 | Foo | 2000-01-02
2 | Bar | 2000-01-01
在此结果中,我删除了一些重复的字段(如A.AID和B.AID,这两个表之间的关系)或不是必需的。
答案 1 :(得分:2)
在table1.id上右连接table2从table2中选择id,max = max(date)
答案 2 :(得分:1)
<强>分析!强>
测试数据:
create table t1
(id number primary key,
name varchar2(20) not null
);
create table t2
(id number not null,
activity varchar2(20) not null,
datefield date not null
);
insert into t1 values (1, 'foo');
insert into t1 values (2, 'bar');
insert into t1 values (3, 'baz');
insert into t2 values (1, 'foo activity 1', date '2009-01-01');
insert into t2 values (2, 'bar activity 1', date '2009-01-01');
insert into t2 values (2, 'bar activity 2', date '2010-01-01');
查询:
select id, name, activity, datefield
from (select t1.id, t1.name, t2.id as t2_id, t2.activity, t2.datefield,
max(datefield) over (partition by t1.id) as max_datefield
from t1
left join t2
on t1.id = t2.id
)
where ( (t2_id is null) or (datefield = maxdatefield) )
外部where子句将从t2元组中过滤除最大日期以外的所有日期,但保留在t2中没有匹配行的空行中。
结果:
ID NAME ACTIVITY DATEFIELD
---------- -------- ------------------- -------------------
1 foo foo activity 1 2009-01-01 00:00:00
2 bar bar activity 2 2010-01-01 00:00:00
3 baz
答案 3 :(得分:0)
要从查询中检索前N个记录,可以使用以下语法:
SELECT *
FROM (your ordered by datefield desc query with join) alias_name
WHERE rownum <= 1
ORDER BY rownum;
PS:我不熟悉PL / SQL,所以也许我错了
答案 4 :(得分:0)
我的解决方案是
从table1右边连接table2中选择(table1.id = table2.id和table2.datefiled =(从table2中选择max(datefield),其中table2.id = table1.id))