2

もう一度質問を組み立てましょう---

  table1{date, bID, sName, fID}
    {11/05,B1,A1,P1}
    {12/05,B2,A2,P2}
    {13/05,B1,A3,P1}
    {15/05,B3,A4,P1}
    {16/05,B1,A5,P2}
    {19/05,B1,A6,P2}

これはテーブルであり、テーブルに格納されているデータも指定されています...

今私が欲しいクエリは次のとおりです:-

fId (たとえば、P1 が選択されている) に応じて、11/05 ~ 17/05 のテーブルのデータを表示する必要があります (日付を見逃すことはありません)。取得されたデータは次のとおりです。

11/05,B1,A1
12/05,--,--
13/05,B1,A3
14/05,--,--
15/05,B3,A4
16/05,--,--
17/05,--,--

特定の fID (たとえば P1) に対して取得されたデータが表示されます。結果を説明しています...

1) 11/05 から 17/05 までのすべてのデータを表示しました。fId は P1 です。データベースに日付がない場合は、その日付の null 値も表示する必要があります (つまり、14/05 の日付はデータベースにありませんでしたが、それでも null 値で表示されます)。

2) その特定の日付の fId が P1 でない場合も、結果セットに null 値が格納されます。

最後に、データが結果セットで取得され、さらに処理されます..

だから私はこの問題のクエリを書きたいのですが、それは可能ですか..

4

2 に答える 2

3

ここにはコードはありません。私の考えだけです。

開始日から終了日までの範囲の日付で一時テーブルを作成する必要があります。次にleft join table1、その一時テーブルをdate列に追加して、を追加しwhere fID = ?ます。

于 2009-05-13T07:01:53.093 に答える
1

ここで他の答えが述べているように、その中にすべての日付が含まれているテーブル、そしてLEFT JOINあなたが必要とするものです。

このテーブルがあるとしましょう:

CREATE TABLE table1
{
    date    DATETIME
    bID     VARCHAR(10),
    sName   VARCHAR(10),
    fID     VARCHAR(10)
}

そして、この日付表:

CREATE TABLE dates
(
    dt      DATETIME
)

この表には、表示する範囲のすべての日付が含まれている必要があります。通常、あなたはそれを両方向に数年で埋めます、しかしそれはあなた次第です。

注:簡単にするために、どちらのテーブルでも主キーを気にしませんでした。もちろん、主キーがあることを確認する必要があります。datesテーブルの場合は、それがdt列である可能性があります。

次に、必要な結果を表示するには:

SELECT
    dt,
    bID,
    sName
FROM
    dates
    LEFT JOIN table1 ON dt = date AND fld = 'P1'
ORDER BY
    dt

P1行のみの選択はJOIN基準で行われることに注意してください。同じことを行う句を追加するWHEREと、データのないすべての日付が失われます。

于 2009-05-13T07:11:31.673 に答える