3

这本质上是一个关于构建 SQL 查询的问题。db 是用 sqlite3 实现的。我是一个相对较新的 SQL 用户。

我有两张桌子,想以一种不寻常的方式加入它们。下面是一个例子来解释这个问题。

表1(t1):

id  year    name
-------------------------
297 2010    Charles
298 2011    David
300 2010    Peter
301 2011    Richard

表 2 (t2)

id  year    food
---------------------------
296 2009    Bananas
296 2011    Bananas
297 2009    Melon
297 2010    Coffee
297 2012    Cheese
298 2007    Sugar
298 2008    Cereal
298 2012    Chocolate
299 2000    Peas
300 2007    Barley
300 2011    Beans
300 2012    Chickpeas
301 2010    Watermelon

我想加入关于 id 和 year 的表格。问题是 (1) id 必须完全匹配,但是如果表 2 中没有与表 1 中年份的完全匹配,那么我想选择下一个(较低)可用的年份。我想要制作的那种选择会给出以下结果

id  year    matchyr name    food
-------------------------------------------------
297 2010    2010    Charles Coffee
298 2011    2008    David   Cereal
300 2010    2007    Peter   Barley
301 2011    2010    Richard Watermelon

总而言之,id=297 与表 1 中给出的 year=2010 完全匹配,因此从表 2 中选择了 id=297, year=2010 的对应行。id=298, year=2011 没有匹配的年份在表 2 中,因此选择了下一个可用年份(小于 2011 年)。如您所见,我还想知道匹配的年份(准确或不准确)实际上是什么。

我非常感谢(1)一个指示(是/否的答案)这是否可以单独在 SQL 中完成,或者我是否需要查看 SQL 之外,以及(2)一个解决方案,如果这不是太繁琐的话。

4

1 回答 1

3

当然,您可以在 SQL 中执行此操作。第一步您需要的是一个查询,它在 id 上连接 t1 和 t2,并为您提供各种可能的年份(编辑:修复了这句话,原来的句子也将下一步纳入其中)。您可以创建一个名为 t3 的视图,如下所示:

CREATE VIEW [t3] AS SELECT t1.id as id, t2.year as year FROM t1 INNER JOIN t2 ON (t1.id = t2.id AND T2.year <= t1.year)

从这里,您需要从每个 id 的 t3 中获取最大年份:

CREATE VIEW [t4] AS SELECT id, MAX(year) FROM t3 GROUP BY id

您应该能够将 t4 重新加入 t1 和 t2 以获得您想要的东西。当然,有一些方法可以缩短它,但它应该让你沿着正确的思路思考。另外,我猜这只是一个示例,但请不要将您的表称为 t1、t2 等。

于 2012-10-25T11:02:27.897 回答