I am struggling to find an elegant solution to this problem.
I have 5 tables and their relationships are described in the image.
一个页面可以有多个产品,每个产品可以有多个 ProductRates。包含特定产品的页面也可以有多种费率。为了解决多对多问题,有表 PageToProductToRate。
用户希望查询多个条件,其中选择可以是任意条件的组合:
- 产品1 + 费率1 + 费率属性1
- 产品1 + 费率1 + 费率属性2
- 产品1 + 费率2 + 费率属性2
- 产品2 + 费率3 + 费率属性1 等...
This is an example of data and WHERE condition and expected results:
And another:
对我有用的查询使用 INTERSECT 来获得正确的结果。我尝试了 UNION 但得到的结果与所有条件不匹配。
SELECT DISTINCT P.[PageID]
FROM [Page] P
join PageToProduct p2p on p2p.[PageID] = P.[PageID]
join Product pr on p2p.[Product] = pr.[Product]
join PageToProductToRate p2p2r on p2p2r.[PageToProductID] = p2p.[PageToProductID]
join ProductRates r on r.[ProductRatesID] = p2p2r.[ProductRatesID]
WHERE (PR.[Product] = 'ALMOND' AND R.CommissionType = 'PREMIUM' AND R.Rate = 0.25)
INTERSECT
SELECT DISTINCT P.[PageID]
FROM [Page] P
join PageToProduct p2p on p2p.[PageID] = P.[PageID]
join Product pr on p2p.[Product] = pr.[Product]
join PageToProductToRate p2p2r on p2p2r.[PageToProductID] = p2p.[PageToProductID]
join ProductRates r on r.[ProductRatesID] = p2p2r.[ProductRatesID]
WHERE (PR.[Product] = 'WALNUT' AND R.CommissionType = 'SERVICE FEE' AND R.Rate = 1.25)
INTERSECT
SELECT DISTINCT P.[PageID]
FROM [Page] P
join PageToProduct p2p on p2p.[PageID] = P.[PageID]
join Product pr on p2p.[Product] = pr.[Product]
join PageToProductToRate p2p2r on p2p2r.[PageToProductID] = p2p.[PageToProductID]
join ProductRates r on r.[ProductRatesID] = p2p2r.[ProductRatesID]
WHERE (PR.[Product] = 'HAZELNUT' AND R.CommissionType = 'EXCESS' AND R.Rate = 1.68)
有没有更好的方法来解决这个问题?我可能会遇到十多个这样的条件,并且包含所有联接的查询可能会失控。
SELECT p2p.PageID
FROM
PageToProduct as p2p
inner join Product as pr
on p2p.Product = pr.Product
inner join PageToProductToRate as p2p2r
on p2p2r.PageToProductID = p2p.PageToProductID
inner join ProductRates as r
on r.ProductRatesID = p2p2r.ProductRatesID
WHERE
(pr.Product = 'ALMOND' AND r.CommissionType = 'PREMIUM' AND r.Rate = 0.25)
OR (pr.Product = 'WALNUT' AND r.CommissionType = 'SERVICE FEE' AND r.Rate = 1.25)
OR (pr.Product = 'HAZELNUT' AND r.CommissionType = 'EXCESS' AND r.Rate = 1.68)
GROUP BY p2p.PageID
HAVING COUNT(*) = 3; /* requires all three are present, as long as no rows are duplicate */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)