0

編集:気にしないで、それを理解しました。興味がある場合は、以下に答えてください。

Postgresql 8.4 を使用しています。

実行する必要があるクエリの形式は次のとおりです (名前と顔は、パラノイアを保護するために変更されています。必要に応じて指定できますが、これはスキーマ、テーブル、および列の名前を単純に置き換えたクエリの直接のコピーです)。

SELECT
    t1.field,
    SUM(v3.quantity) as current_qty
FROM
    schema1.child_table t1
        JOIN (SELECT DISTINCT t1key FROM schema2.child_transaction t2 WHERE datefield BETWEEN '2012-04-01' AND '2012-04-19') t2 USING (t1key)
        LEFT JOIN schema1.child_current_status v3 ON t1.t1key = v3.t1key
        JOIN schema1.parent_table t4 ON t1.t4key = t4.t4key
WHERE
    t4.criteria = 763
GROUP BY
    t1.field

... 基本的に、 で提供されたデータと一致する場合、および要求された期間中に関連するトランザクションが少なくとも 1 つある場合に、fieldからが必要です。ビューに数量がある場合は、それらも必要です。child_tablecriteriaparent_tablechild_transactionchild_current_status

t1.field人間が読める数値キーと同等と見なすことができますt4.criteria

child_current_status私の問題は、そこにデータがある場合でも、提供されたクエリが数量データを提供できないことです。

編集:明確にするために、上記のクエリはfield, NULL、返すべき場所で を返しますfield, current_qty

問題はt2サブクエリに関連しています。サブクエリを a に変更するとLEFT JOIN、関連する数量データが返されるためです。

SELECT
    t1.field,
    SUM(v3.quantity) as current_qty
FROM
    schema1.child_table t1
        LEFT JOIN (SELECT DISTINCT t1key FROM schema2.child_transaction t2 WHERE datefield BETWEEN '2012-04-01' AND '2012-04-19') t2 USING (t1key)
        LEFT JOIN schema1.child_current_status v3 ON t1.t1key = v3.t1key
        JOIN schema1.parent_table t4 ON t1.t4key = t4.t4key
WHERE
    t4.criteria = 763
GROUP BY
    t1.field

編集: この変更されたクエリは を返しますが、要求された期間にfield, current_qtyトランザクションがあるかどうかに関係なくそうしますchild_transaction

...私が行ったのは、最初のJOINをLEFT JOINに変えることだけで、そのクエリは関連する数量をchild_current_status. を INNER JOINに変更するchild_current_statusと、クエリは何も返しません。最初の JOIN を LEFT JOIN にすることの問題は、サブクエリから返されたデータがある場合にのみ結果を返す必要があることです。この場合、要求された期間があります。

水を濁らせるために、いくつか t4.criteriaの場合は適切に機能しますが、763 は失敗するものにすぎません。

ここで何が欠けていますか?


短いバージョン: 上記の最初のクエリから、最初の JOIN が INNER JOIN の場合、LEFT JOIN は何も返さない。LEFT JOIN の場合、LEFT JOINchild_current_statusは適切なデータを返しますが、最初の JOIN の目的が無効になります。

編集:LEFT JOINをFROM句の最後、INNER JOINの後ろに移動しようとしましたが、変更はありません

4

1 に答える 1

0

うーん、気にしないでください、私はそれを理解しました。クエリは適切に機能しており、ここにいる他の誰かがそれを理解するのに十分なデータがありません。基本的に、 内の 1 つの子に対して 1 つのトランザクションがあり、child_table内の他の子に対して現在の数量がありchild_tableます。そのため、クエリは、指定された親に対して指定された時間内に取引があった子の現在の数量がないことを適切に示しています。

問題が発生したのは、このクエリの結果を処理する際に、戻ってすべての子に関連する現在のデータを要求したためです (関連するトランザクションを持つものだけではなく)。 ) 無いと言っていました。

ここには何もありません。先に進んでください。

于 2012-04-19T18:26:02.683 に答える