如何使用top 1在子查询中获得两列?

b09cbbtk  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(350)

事情是这样的。我有两张table:
表a:

id    col1    date_x
A     xxxx    2020-02-02
B     yyyy    2020-02-02
C     zzzz    2020-02-02

表b

id    col2    date_y
A     yyyy    2020-01-02
A     yyyy    2020-02-02
A     yyyy    2020-03-02

我想在date\u y是可能的最高值时带来col2,但它必须低于date\u x。
我就是这么做的:

select *,
       (
         select top 1 col2
         from table_B
         where table_B.date_y < a.date_x 
         and table_B.id = a.id
       ) as col2                   
from table_A a

现在,我还想带上dateïy,以便做一些验证。
最好的方法是什么?我想创建另一个(选择前1…),但这似乎非常低效。另一个连接也将是低效的。

w80xi6nr

w80xi6nr1#

您可以根据自己的条件加入表并使用 MAX() 以及 FIRST_VALUE() 窗口函数来获取 date_y 以及 col2 价值观:

select distinct a.*,
       first_value(b.col2) over (partition by a.id order by b.date_y desc, b.col2) col2,
       max(b.date_y) over (partition by a.id) date_y
from tableA a left join tableB b
on b.id = a.id and b.date_y < a.date_x

你可以改变主意 LEFT 加入 INNER 如果您只想从这两个表中得到匹配的行,请使用join。
请看演示。

7d7tgy0s

7d7tgy0s2#

使用相关子查询的方法是可以的,并且支持红移 top (虽然我更喜欢 limit ,这在其他数据库中得到了更广泛的支持)。
但是你错过了一个 order by 子查询中的子句-如果没有它,则会从满足 where 条款,这不是你想要的。
我建议:

select 
    a.*,
    (
        select col2
        from table_B b
        where b.date_y < a.date_x and b.id = a.id
        order by b.date_y desc
        limit 1
    ) as col2                   
 from table_A a

对于性能,请考虑 table_B(id, date_y, col2) .

相关问题