編集:気にしないで、それを理解しました。興味がある場合は、以下に答えてください。
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_table
criteria
parent_table
child_transaction
child_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の後ろに移動しようとしましたが、変更はありません