ПРИСОЕДИНЯЙТЕСЬ к SQL-выражению с условным предложением WHERE без использования процедур? - PullRequest
0 голосов
/ 20 февраля 2011

Я использую SQLServer 2005. У меня есть форма, где пользователь выбирает элементы «Дополнения». Они могут быть в конкретном плане, который платит за эти дополнения цену, отличную от розничной.

У меня есть две таблицы:

Аддоны

ID--------AddonName--------RetailCost
6---------Red Tint---------85
7---------Green Tint-------75

Addons_Override (эта таблица переопределяет розничную стоимость предмета со специальной стоимостью для этого PlanID)

AddonID--------PlanID--------Cost
6--------------10------------50
6--------------11------------25

Пользователь выбирает красный оттенок (ID = 6) и зеленый оттенок (ID = 7) и находится в PlanID = 10. Я хочу показать выбранные предметы Аддона с соответствующей стоимостью.

Хотите этот результат:

ID--------AddonName--------RetailCost--------Cost--------PlanID
6---------Red Tint---------85----------------50----------10
7---------Green Tint-------75----------------75----------NULL

Не этот результат:

ID--------AddonName--------RetailCost--------Cost--------PlanID
6---------Red Tint---------85----------------50----------10
6---------Red Tint---------85----------------25----------11
7---------Green Tint-------75----------------75----------NULL

Текущий SQL

SELECT 
  DISTINCT t1.ID, 
  t1.RetailCost, 
  Cost=case when t2.VisionPlanID=10 then t2.Cost else t1.RetailCost end,  
  t2.PlanID 
FROM 
  Addons t1 
LEFT OUTER JOIN 
  Addons_Override t2 
ON 
  t1.ID=t2.AddonID 
WHERE (VisionPlanID=10 AND ID=6) or ID=7

Проблема в том, что я не могу написать оператор select подобным образом, поскольку я не знаю, какие из них находятся в таблице Addons_Override. Какой оператор select будет работать, чтобы дать мне результат, который я хочу выше?

Пожалуйста, помогите!

Ответы [ 3 ]

1 голос
/ 20 февраля 2011
SELECT t1.ID, t1.RetailCost,
    COALESCE(t2.Cost, t1.RetailCost) As Cost,
    t2.PlanID
FROM Addons t1
LEFT JOIN Addons_Override t2 ON t1.ID = t2.AddonID AND t2.PlanID=10
WHERE t1.ID IN (6,7)
1 голос
/ 20 февраля 2011
SELECT t1.ID, t1.RetailCost,
CASE 
 WHEN t2.PlanID IS NOT NULL THEN t2.Cost
 ELSE t1.RetailCost
END as Cost,
t2.PlanID
FROM Addons t1
LEFT JOIN Addons_Override t2 ON (t1.ID = t2.AddonID AND t2.PlanID = 10)
0 голосов
/ 20 февраля 2011
SELECT 
  DISTINCT t1.ID, 
  t1.RetailCost, 
  Cost=case when t2.VisionPlanID=10 then t2.Cost else t1.RetailCost end,  
  t2.PlanID 
FROM Addons t1 
LEFT OUTER JOIN Addons_Override t2 ON  t1.ID=t2.AddonID AND
( (VisionPlanID=10 AND ID=6) OR ID=7)

Просто переместите любой элемент, который ссылается на таблицу 2, из предложения WHERE в предложение JOIN.

...