Я изо всех сил стараюсь найти элегантное решение этой проблемы. У меня 5 таблиц, и их отношения описаны на изображении. SQL SELECT несколько условий для многих отношений
Страница может иметь несколько продуктов, и каждый продукт может иметь много ProductRates. Страница с конкретным продуктом может иметь много ставок. Чтобы обойти многие проблемы, существует таблица PageToProductToRate.
Пользователи хотят запроса на нескольких условиях, когда выбор может быть сочетание любого:
- Product1 + rate1 + скорость attribute1
- Product1 + rate1 + скорость attribute2 attribute2
- Product1 + rate2 + скорость
- Product2 + Rate3 + скорость attribute1 и т.д. ...
Это пример данных и где состояние и ожидаемые результаты:
И еще:
Запрос, который работает для меня использует 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)
Есть ли лучший способ решить эту проблему? Я мог бы иметь более дюжины этих условий, и запрос со всеми объединениями мог выйти из-под контроля.
Вы пытаетесь выбрать страницы, которые не имеют выбранные продукты? – tshoemake
Вы используете параметры для фильтрации данных? если так, то как они выглядят? – JamieD77
Я думаю, вместо '() AND() AND()', вам нужно '() OR() OR()'. –