这实际上是关于构造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)解决方案(如果不是这样)的指示(是/否答案)太麻烦了。
答案 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等。