3

これは本質的に、SQL クエリの作成に関する質問です。データベースは sqlite3 で実装されています。私は SQL の比較的新しいユーザーです。

2 つのテーブルがあり、通常とは異なる方法でそれらを結合したいと考えています。以下は、問題を説明するための例です。

表 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と年でテーブルに参加したい。問題は、(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 と完全に一致したため、id=297, year=2010 の対応する行は表 2 から選択されます。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 に答える