SQL查询。不寻常的加入。数据库在sqlite-3中实现

时间:2012-10-25 10:39:14

标签: sql sqlite

这实际上是关于构造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必须完全匹配,但如果表1中表2中没有完全匹配,那么我想选择下一个(较低)可用的年份。我想要生成的那种选择会产生以下结果

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)解决方案(如果不是这样)的指示(是/否答案)太麻烦了。

1 个答案:

答案 0 :(得分: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)

从这里开始,你需要从每个身份的t3获得最大年份:

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

你应该能够将t4加入t1和t2以获得你想要的东西。当然,有一些方法可以缩短它,但它应该让你思考正确的方向。另外,我猜它只是一个例子,但请不要把你的表叫做t1,t2等。