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

Sql 如何使用top 1在子查询中获得两列?,sql,database,join,subquery,amazon-redshift,Sql,Database,Join,Subquery,Amazon Redshift,事情是这样的。我有两张桌子: 表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_y是可能的最高值时带来col2,但它必须低于date

事情是这样的。我有两张桌子:

表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_y是可能的最高值时带来col2,但它必须低于date_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名。。。但这似乎效率很低。另一个联接也会效率低下。

您可以根据自己的条件联接表,并使用MAX和FIRST_VALUE窗口函数来获取日期y和col2值:

如果只需要两个表中的匹配行,可以将左连接更改为内部连接。
请参阅。

您使用相关子查询的方法是可以的,并且红移支持top,尽管我更喜欢limit,但在其他数据库中更广泛地支持top

但是,您在子查询中缺少ORDERBY子句——如果没有它,您将从满足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上的索引,DATEYY,COL2.

,嗯,我没有遇到任何错误。@一匹没有名字的马,不知道postgresql如何解释上面的代码,但是代码运行得很好,这是Amazon红移,不是postgresql。虽然它们有一些古老的共同根,但它们与productssory有着本质上的不同,这一点仍然是新的。我们得到了一个错误:带有orderby子句的聚合窗口函数需要一个frame子句;表B中的同一id是否有重复的日期?在这种情况下,如果在多行中可以找到可能的最高日期,您想要哪一个col2值?@DumbML是否有不接受答案的原因?
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