SQL右连接,强制从右侧只返回一个值

时间:2010-08-13 08:39:43

标签: sql oracle10g

table 1
---
id , name

table2
---
id , activity, datefield

table1'右连接'table2将从右表(table2)返回多于1个结果。如何使得只返回具有最高日期的table2的“1”结果

5 个答案:

答案 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,这两个表之间的关系)或不是必需的。

  • 提示:如果你有更多的表进入sql,这也有效。 sql“生成”查询,然后应用分组以使用B将B的重复限制为最高日期。

答案 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))