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;