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

SQL右连接,强制从右侧仅返回一个值,sql,oracle10g,Sql,Oracle10g,表1“右联接”表2将从右表表2返回多个结果。如何使其仅从表2中返回一个结果,其中表1上的日期最高。要从表2中选择id,max=maxdate;要从表1上选择id,max=maxdate;要从表2中选择id,max=maxdate;要从查询中检索前N个记录,可以使用以下语法: table 1 --- id , name table2 --- id , activity, datefield PS:我不熟悉PL/SQL,所以从查询中检索前N个记录可能是我错了,您可以使用以下语法: table 1

表1“右联接”表2将从右表表2返回多个结果。如何使其仅从表2中返回一个结果,其中表1上的日期最高。要从表2中选择id,max=maxdate;要从表1上选择id,max=maxdate;要从表2中选择id,max=maxdate;要从查询中检索前N个记录,可以使用以下语法:

table 1
---
id , name

table2
---
id , activity, datefield

PS:我不熟悉PL/SQL,所以从查询中检索前N个记录可能是我错了,您可以使用以下语法:

table 1
---
id , name

table2
---
id , activity, datefield

PS:我不熟悉PL/SQL,所以可能我错了

你写的问题信息很差,但我会试着举个例子来帮助你

您有一个表a和一个表B,需要获取与表a相关的表B的顶部日期

示例表:

如果执行此操作,请执行以下操作:

您可以获得A和B的所有信息,这些信息由ID关联,在这个理论案例中,ID是两个表链接关系的公共字段

SELECT * FROM A RIGHT JOIN B ON B.ID = A.ID
但是您只需要表A中每个元素的最后一个日期,即B的顶部日期

接下来,如果只需要获取最早日期,则需要通过B.AID对查询进行分组,并仅获取最早日期

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.AID和B.AID,它们是两个表之间的关系,或者是不需要的

提示:如果sql中有更多的表,也可以这样做。sql进行查询,然后应用一个分组,使用B将重复B的次数限制在最早的日期。
关于你的问题,你写的信息很差,但我会试着举个例子来帮助你

您有一个表a和一个表B,需要获取与表a相关的表B的顶部日期

示例表:

如果执行此操作,请执行以下操作:

您可以获得A和B的所有信息,这些信息由ID关联,在这个理论案例中,ID是两个表链接关系的公共字段

SELECT * FROM A RIGHT JOIN B ON B.ID = A.ID
但是您只需要表A中每个元素的最后一个日期,即B的顶部日期

接下来,如果只需要获取最早日期,则需要通过B.AID对查询进行分组,并仅获取最早日期

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.AID和B.AID,它们是两个表之间的关系,或者是不需要的

提示:如果sql中有更多的表,也可以这样做。sql进行查询,然后应用一个分组,使用B将重复B的次数限制在最早的日期。 我的解决办法是

从表1中选择右键连接表1上的表2。id=table2.id和table2.datefield=从表2中选择maxdatefield,其中table2.id=table1.id

我的解决方案是

从表1中选择右键连接表1上的表2。id=table2.id和table2.datefield=从表2中选择maxdatefield,其中table2.id=table1.id

Analytics

测试数据:

B.AID | A.NAME | B.DateField
------|--------|--------------
  1   |   Foo  |  2000-01-02
  2   |   Bar  |  2000-01-01
查询:

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');
outerwhere子句将从t2元组中过滤掉除最大日期以外的所有数据,但保留在空行中,其中t2中没有匹配行

结果:

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) )
分析

测试数据:

B.AID | A.NAME | B.DateField
------|--------|--------------
  1   |   Foo  |  2000-01-02
  2   |   Bar  |  2000-01-01
查询:

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');
outerwhere子句将从t2元组中过滤掉除最大日期以外的所有数据,但保留在空行中,其中t2中没有匹配行

结果:

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

需要更多的上下文:您只是对表2中某些条件下的最大日期感兴趣,还是对表2中的一组列感兴趣?表1与表2、表3、表4……等连接。。我想从表2中得到一行,但在整个查询中,我想返回一组列需要更多的上下文:您只是对表2中某些条件下的最大日期感兴趣,还是对表2中的一组列感兴趣?表1与表2、表3、表4等连接。。我想从表2中得到一行,但是整个查询,我想返回一堆列。我的表1连接到了表2旁边的许多其他表,所以我不能像您建议的那样使用查询,因为这将返回1个结果。请参阅我的最新问题。我希望表2只返回最新的DateField。我的表1与表2旁边的许多其他表连接,因此我不能像您建议的那样使用查询,因为这将返回1个结果。请参阅我的最新问题。我想要表2只返回最新的datefieldnope,这不是我想要的。我仍然希望在最后返回多个结果,正如我提到的,我还加入了表2旁边的许多其他表。但当“与表2右连接”时,这部分我想返回一条带有max datenope的记录,这不是我想要的。我仍然希望在最后返回多个结果,正如我提到的,我还加入了表2旁边的许多其他表。但当“right join with table2”时,这部分我想返回1条记录的最大日期