SQL SELECT QUERY - 来自两个表

Posted

技术标签:

【中文标题】SQL SELECT QUERY - 来自两个表【英文标题】:SQL SELECT QUERY - from two tables 【发布时间】:2018-02-12 14:41:15 【问题描述】:

我遇到了一个关于 SQL 查询的难题。 请帮帮我

我有两张如下表。

TABLE_A                   TABLE_B
Date      Value_A         Date      Value_B
20180201   52             20180131   120
20180202   50             20180201   114
20180205   48             20180203   127
20180206   57             20180204   140
20180207   60             20180206   129

我想得到这个结果。

Date       Value_A     PreValue_B
20180201    52          120
20180202    50          114
20180205    48          140
20180206    57          140
20180207    60          129

Date 和 Value_A 与 TABLE_A 相同。 PreValue_B 来自 Value_B。 但它是 TABLE_B 的最大值(最接近)和上一个日期的值。

因此,TABLE_B 最接近的先前日期 20180201 是“20180131”。 ...

20180205 最接近的前一个日期是“20180204”,所以 PreValue_B 是 140。

20180206 是“20180204”,所以 PreValue_B 又是 140。 等等……

如何进行 SQL 查询?

谢谢大家!

【问题讨论】:

请标记您的 DBMS(mysql、sql server、oracle 等) 【参考方案1】:

一种典型的方法是使用相关子查询:

select a.*,
       (select b.value
        from b
        where b.date < a.date
        order by b.date desc
        fetch first 1 row only
       ) as prevalue_b
from a;

这使用 ANSI 标准方法来限制为一行。一些数据库将其拼写为limitselect top 1

【讨论】:

什么是fetch first 1 row only?我从未在 SQL 中看到过。 太棒了!谢谢戈登! @Sirmyself 我将 "fetch first 1 row only" 更改为 "limit 1" ,效果很好。 @b-a 谢谢。但是,它来自哪里? ^^【参考方案2】:

试试这个:

SELECT sub.date, sub.a, b.b
FROM
(SELECT a.date, a.a, MAX(b.date) AS b_date
 FROM a
 INNER JOIN b
 ON (a.date > b.date)
 GROUP BY a.date, a.a) sub
INNER JOIN b
ON sub.b_date = b.date
ORDER BY sub.date

在子查询中,为a中的每个日期找到b中应选择的日期。然后将结果连接回b,以显示b值。

在这里测试:http://rextester.com/ERP28040

【讨论】:

谢谢,我不明白什么是“内连接”,但我不会忘记,很快就会学会。

以上是关于SQL SELECT QUERY - 来自两个表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Query用于汇总来自不同表的字段

Google Big Query 标准 SQL,在 SELECT 语句中添加一列

SQL Query 或 View with columns 取决于 SELECT 查询

第八十章 SQL命令 UNION

来自数据库的 Sql 查询

sql查询只打印第一行