gpt4 book ai didi

sql - 条件JOIN产生两行

转载 作者:行者123 更新时间:2023-12-03 18:58:33 25 4
gpt4 key购买 nike

我正在尝试加入两个像这样的表:

表A

A1, A2, A3
A, 1, 35
A, 1, 70
A, 1, 105


表B

B1,B2, B3
B, 1, 30
C, 1, 32
D, 1, 40
E, 1, 55
F, 1, 60
G, 1, 77
H, 1, 80


预期的结果是这样的:

A, 1, 35, C, 32
A, 1, 70, F, 60
A, 1, 105, H, 80


也就是说,对于表A中的每一行,我只想从表B中选择一行,应该是B3值较小但最接近A3值的行。

到目前为止,我已经尝试了以下查询:

SELECT A1, A2, A3, B1, B3 FROM A JOIN (SELECT B1, B2, B3 FROM B ORDER BY B2, B3 DESC) AS A ON A.A2 = B.B2 AND A.B3 < A.A3

但是,这导致表如下:

A, 1, 35, B, 30
A, 1, 35, C, 32
A, 1, 70, B, 30
A, 1, 70, C, 32
A, 1, 70, D, 40
A, 1, 70, E, 55


等等。我还尝试向内部SELECT添加LIMIT 1,但这不会产生任何结果。如果我自己运行内部查询(使用LIMIT 1),则可以得到预期的结果。如何更改查询以产生期望的结果?我目前正在使用sqlite,但想以可移植到其他DBMS的方式编写此代码。

最佳答案

我没有可用的SQLite,但是以下在SQL Server中有效;您应该可以将TOP替换为LIMIT。

只要您指定TOP 1,就应该能够从select的嵌套查询中获取它:

select *, 
(select top 1 B3
from B
where B3 <= A3
order by B3 desc)
from A


编辑:要从B添加额外的列,需要将上述查询嵌套到子查询中:

select t.*, B.B1 from (
select *,
(select top 1 B3
from B
where B3 <= A3
order by B3 desc) as B3
from A
) as t join B on B.B3 = t.B3

关于sql - 条件JOIN产生两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15479908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com