Sql 如何仅选择第一行?

Sql 如何仅选择第一行?,sql,oracle,Sql,Oracle,我有这张桌子 Table_A link name 1 toto 2 lulu Table_B link action date 1 OK 01/02/2010 1 OK 01/02/2022 1 OK 01/03/2021 1 OK 01/02/2025 然后我想做类似的查询 Select * from

我有这张桌子

Table_A

  link    name
  1       toto 
  2       lulu

Table_B

  link    action   date
  1       OK       01/02/2010 
  1       OK       01/02/2022
  1       OK       01/03/2021
  1       OK       01/02/2025
然后我想做类似的查询

Select 
  * 
from 
  Table_A, Table_B 
where
  table_A.link (+)= table_b.link and
  table_b.action (+)= 'OK' 
问题是此查询返回重复的结果

link    name    action    date
1       toto    OK        01/02/2010 
1       toto    OK        01/02/2022
1       toto    OK        01/03/2021
1       toto    OK        01/02/2025
2       lulu
我想:

link    name    action    date
1       toto    OK        01/02/2025
2       lulu

如何操作?

您可以使用
Distinct
语句:选择唯一的数据

另请查看
分组依据
语句:按特定列分组,例如选择唯一名称:

选择
* 
从…起
表A、表B
哪里
表A.link(+)=表b.link和
表b.行动(+)=‘正常’
按表格名称分组

您可以使用
行数()
窗口分析功能

Select link, name, action, "date"
  From
  (
   Select a.link, a.name, b.action, b."date",
          row_number() over (partition by a.link order by b."date" desc ) as rn
     From Table_A a
     Left Join Table_B b 
       on a.link = b.link
      and b.action = 'OK' 
  )
  Where rn = 1;

LINK  NAME  ACTION  date
----  ----- ------  ----------
1     toto  OK      01.02.2025
2     lulu  NULL    NULL


另外,显然,我不建议使用旧的逗号分隔连接语法,而我使用的是上面查询中的ANSI-92 SQL语法。另一句话是Oracle DB的SQL不需要子查询的别名,但大多数其他DBMS都需要别名。

通常最好使用ANSI连接语法,但在您的指导下,我将使用Oracle语法(外部连接使用“plus”操作符)

首先,请注意,
WHERE
子句中第一个条件的“plus”位于错误的一侧;您需要将“虚拟”行添加到
表B
,而不是
表A

然后,如果只依赖于一个表,通常最好先进行聚合。这就是我在下面
FROM
子句的子查询中所做的

另外,
date
是Oracle关键字,不应将其用作列名。我希望你不是那样使用它。对于我的代码,我假设列名为
dt

select a.link, a.name, b.action, b.dt
from   table_a a,
       ( select link, 'OK' action, max(dt) dt
         from   table_b
         where  action = 'OK'
         group  by link
       ) b
where  b.link (+) = a.link
;

使用正确、明确、标准的
连接
语法

编写查询的简单方法:

Select a.*, b.*
from Table_A a left join
     (select b.*, row_number() over (partition by b.link order by b.date desc) as seqnum
      from Table_B b
      where b.action = 'OK'
     ) b
     on b.link = a.link and b.seqnum = 1;
或使用聚合:

Select a.link, a.name, b.action, max(b.date)
from Table_A a left join
     Table_B b
     on b.link = a.link and b.action = 'OK'
group by a.link, a.name, b.action
1) 使用关键字分组

2) 对于日期,良好做法使用格式:YYYY-MM-dd

link action date
1    OK     2010-02-01
用于显示:

link name action date
1    toto OK     2025-02-01
2    lulu        2023-03-01
在表b中插入lulu条目

我的桌子b:

link  action  date
1     OK      2010-02-01
1     OK      2022-02-01
1     OK      2021-03-01
1     OK      2025-02-01
2             2023-03-01
3) 尝试此查询(Mysql语法):


…通过不使用连接的
(+)
符号,我可以从您那里得到不同的结果。看起来您的外部连接条件实际上是
where table_b.link(+)=table_a.link
(正如表在
from
子句中出现的顺序所暗示的那样),这相当于
from table_a left join table_b
,而不是相反。这很接近,但是我还需要一个字段和:选择link,“OK”action,还有一个字段,表b中的max(dt)dt,其中action='OK'group by link return me不是一个group by expression:(@Stephane-我在你原来的帖子中没有看到任何关于这方面的内容。对不起,我看不懂你的想法。
SELECT 
  Table_A.link, Table_a.name, action, MAX(date) AS date
FROM 
  Table_A, Table_B 
WHERE
  Table_A.link = Table_B.link
  GROUP BY name
  ORDER BY link;