2017-08-18 21 views
3

データを抽出する読み取り専用Firebirdデータベースがあります。 MS-Accessでは、3つの簡単なクエリを使用して、それぞれのクエリの出力が次のクエリへの入力となるデータを取得するのは非常に簡単です。今私はこれをPHPでプログラムし、それを1行にまとめたいので、これらの3つのクエリを1つにまとめたいのですが、わかりません。1つのクエリでMIN関数を使用する場合のsqlクエリの結合方法

最初のクエリは、私の会社計画(最大1000行)にある今日のすべての日付を私に与えます。より多くの日にいくつかの仕事が計画されているので、今日からの最初の日だけが必要です。クエリ2でMIN関数を使用してこれを取得します。最後のクエリでは、左の結合を使用して、すべての保留中のジョブを生成された最初の日付と結合します。

これはどのようにして1つのクエリで実行できますか?私は読書権しか持っていないので、私は一時的なテーブルを扱うことができません。

誰かから指示をお願いできますか?

**First step** 
SELECT 
    salesorderplan.plandate,  
    salesorderplan.salesorder 
FROM 
    salesorderplan 
WHERE 
    salesorderplan.plandate >= Date(); 

**second step** 
SELECT 
    Min([1estap].plandate) AS firstplandate, [1estap].salesorder 
FROM 
    [1estap] 
GROUP BY 
    [1estap].salesorder; 

**third step** 
SELECT 
    salesorder.orderno, 
    [2estap].firstplandate, 
    salesorder.description, 
    salesorder.deliverylocname, 
    salesorder.deliveryaddress, 
    salesorder.deliverycity 
FROM 
    ((salesorder) 
    left join 2estap on (salesorder.objectid = [2estap].salesorder)) 
WHERE 
    salesorder.salesstatus=1 
ORDER BY 
    salesorder.orderno; 

私は2つのテーブルを持っています。最初は、すべての私の仕事を含むsalesorderです。 2番目はsalesorderplanと呼ばれ、ジョブナンバーの計画ですべての日付が含まれています。

SALESORDER 
objectid description etc 
342567 blah blah 
356782 jwz 
384512 not in planning yet 

SALESORDERPLAN 
objectid salesorder plandate 
23451 342567  12-03-2017 
23489 342567  14-04-2017 
23490 356782  13-03-2017 
23496 356782  18-06-2017 
23499 342567  21-08-2017 
23499 342567  28-08-2017 
23512 356782  30-08-2017 
23524 356782  2-09-2017 

私のすべての注文のリストが必要です。私の計画の日付があれば、私は今日の後の最初の日付をしたい(私はMINののFucTを使用場所な) だから、結果は私が私が持っていないと言って、これを前置きする必要があり

Result 
objectid description    plandate 
342567 blah blah    21-08-2017 
356782 jwz      30-08-2017 
384512 not in planning yet  no date 
+0

クエリが作成されるように、テーブルの相互関係を表示する必要があります。可能であれば、テーブルの構造を表示し、可能であれば、テーブルのサンプルデータとそのサンプルから目的の結果を表示します。 –

+0

実際に何をしようとしたのか、間違ったのか、どのFirebirdのバージョンを使用していますか(あなたの質問には、1.xのような古代のバージョンが使われているようです)。 –

答えて

2

する必要がありますfirebirdの経験がありますが、私はSQLの経験があります。これはあなたのために働くかもしれない:

-- **third step** 
SELECT 
    salesorder.orderno, 
    [2estap].firstplandate, 
    salesorder.description, 
    salesorder.deliverylocname, 
    salesorder.deliveryaddress, 
    salesorder.deliverycity, 
FROM salesOrder LEFT JOIN (
    -- **second step** 
    SELECT 
     Min([1estap].plandate) AS firstplandate, [1estap].salesorder 
    FROM (
     -- **First step** 
     SELECT 
      salesorderplan.plandate,  
      salesorderplan.salesorder 
     FROM 
      salesorderplan 
     WHERE 
      salesorderplan.plandate >= Date() 
    ) [1estap] 
    GROUP BY 
     [1estap].salesorder 
) [2estap] ON (salesorder.objectid = [2estap].salesorder)) 
WHERE 
    salesorder.salesstatus=1 
ORDER BY 
    salesorder.orderno; 

EDIT @MarkRotteveelによって指摘

として、あなたの最初の2つのクエリを1つにまとめることができます。

-- **third step** 
SELECT 
    salesorder.orderno, 
    [2estap].firstplandate, 
    salesorder.description, 
    salesorder.deliverylocname, 
    salesorder.deliveryaddress, 
    salesorder.deliverycity, 
FROM salesOrder LEFT JOIN (
    -- **first & second steps** 
    SELECT 
     Min(plandate) AS firstplandate, salesorder 
    FROM salesorderplan 
    WHERE 
     plandate >= Date() 
    GROUP BY 
     salesorder 
) [2estap] ON (salesorder.objectid = [2estap].salesorder)) 
WHERE 
    salesorder.salesstatus=1 
ORDER BY 
    salesorder.orderno; 
+1

+1これはFirebird(少なくともFirebird 2.0以上を前提とする)で動作するはずです。第1ステップと第2ステップを1つのクエリに結合することが可能でなければならないことに注意してください。 –

+0

@MarkRotteveel - 合意。 OPの方が私がここで何をしたのかをもっと簡単に見ることができるように、このように残しました。私はクリーンアップされたクエリで編集を追加します。 – STLDeveloper

+0

集計クエリは、Min(プランド)を引き出すための検討からsalesstatus = 1レコードを除外する必要がありますか? – June7

関連する問題