テーブルの「サークル」から必要なデータを取得する方法に興味があります。
私は 5 つのテーブル (およびいくつかのサポート テーブル) を持っています: ジャンクション テーブルで結合された 3 つのエンティティ。したがって、一般的なモデルは次のようになります。
カードには多くの予算があり、アカウントには多くの予算があり、アカウントには多くのカードがあります。
したがって、私のリレーションシップは、ジャンクション テーブルを介して、カードから予算、アカウント、カードに戻るという円を形成します。この構造が配置されているあいまいな結合を回避する方法。AccountBudget テーブルと CardBudget テーブルを作成したほうがよかったのではないかと思いますが、どちらもまったく同じ種類のデータを定義するため、1 つのテーブルの方が効率的であると思われます。
私が取得しようとしている情報は、基本的に、特定のタイプのすべてのカードの合計予算制限と、同じタイプのすべてのアカウントの合計予算制限です。私はこの問題を間違って見ているだけですか?
// Card Budget_Card Budget Budget_Account Account
// ------- --------- -------- -------------- ---------
// cardId------\ budgetId<---------budgetId------>budgetId -----accountId--(to Card)->
// accountId --->cardId limit accountId<------/ typeId
// (etc) typeId (etc)
// (typeId in Budget is either 1 for an account budget or 2 for a card budget.)
見ての通り円です。私が達成しようとしているのは、2 つの列を持つ 1 つの行を返すことです。 whereBudget.limit
のレコードの合計と、同じ型の sに属するすべての行の合計です。Account
typeId = 1
Budget.limit
Card
Account
提案に従って、実際にはユニオンから必要なデータを取得できますが、データが2つの別々の列にない場合は役に立ちません:
SELECT DISTINCTROW Sum(Budget.limit) AS SumOfLimit
FROM (Account RIGHT JOIN Card ON Account.accountId = Card.accountId)
RIGHT JOIN (Budget LEFT JOIN Budget_Card ON Budget.budgetID = Budget_Card.budgetId) ON Card.cardId = Budget_Card.cardId
GROUP BY Budget.typeId, Budget.quarterId, Account.typeId
HAVING (((Budget.typeId)=2) AND ((Budget.quarterId)=[@quarterId]) AND ((Account.typeId)=[@accountType]))
UNION SELECT DISTINCTROW Sum(Budget.limit) AS SumOfLimit
FROM Budget LEFT JOIN (Account RIGHT JOIN Budget_Account ON Account.accountId = Budget_Account.accountId) ON Budget.budgetID = Budget_Account.budgetId
GROUP BY Budget.typeId, Budget.quarterId, Account.typeId
HAVING (((Budget.typeId)=1) AND ((Budget.quarterId)=[@quarterId]) AND ((Account.typeId)=[@accountType]));