SQL Запрос к серверу, который возвращает элементы с внешним ключом и элементы, у которых его нет - PullRequest
0 голосов
/ 11 января 2020

У меня есть страница со скидкой, на которой я могу добавлять товары со скидкой.

Каждый продукт отображается с рядом вариантов продукта, которые затем можно снять, если они не являются частью скидки.

Когда я нажимаю сохранить, каждый «ПРОВЕРЕНО» ProductId и VariantId будет храниться в таблице с именем StoreDiscountRuleVariant.

Если для редактирования открывается существующая страница скидки, то мой запрос SQL больше не выбирает непроверенные варианты продукта из таблицы ProductVariant, а только "проверенные", которые были сохранены.

Я хочу, чтобы запрос SQL возвращал оба варианта ProductVariants, которые имеют соответствующий внешний ключ optionId в таблице StoreDiscountRuleVariant, а также те, которые не имеют. Мне также понадобился бы дополнительный возвращаемый столбец, который показывает, действительно ли в таблице StoreDiscountRuleVariant присутствовал variableId - например, isChecked = true / false.

Я думаю, что это решение будет лучше, чем сохранение обоих проверенных а также непроверенные варианты-идентификаторы в таблице StoreDiscountRuleVariant после сохранения, поскольку новые варианты продукта, добавленные после внесения этой скидки, не будут отображаться при редактировании.

Мне указали в направлении этого: 1016 *

 SELECT p.productid, pv.variantnameSE, pv.sku, pv.variantId, 
 rv.discountrulevariantid, rv.productvariantid FROM 
 dbo.StoreDiscountRuleVariant rv INNER JOIN dbo.Product p ON p.productId = 
 rv.productid LEFT JOIN dbo.productVariant pv ON pv.foreignProductId = 
 p.productId WHERE rv.discountruleid = 24 

Вот результат:

Row1:

produktid: 1326, вариантnamese: Vit, sku: FOD46-1, вариант.variantid: 822, discountrulevariantid: 572 , discountrulevariant.productvariantid: 1035

ROW2:

produktid: 1326, вариант имени: Сварт, sku: FOD46-2, вариант. Вариант: 1035, скидка 1027 *

Только ROW2 / variantid: 1035 существует в таблице StoreDiscountRuleVariant. Поэтому, по крайней мере, для меня странно то, что дисконтрулевариантид указывает на 1035 в обоих рядах. не должно быть Row1 discountrulevariantid: значение пустым, поскольку variantid: 822 не существует в StoreDiscountRuleVariant.

1 Ответ

0 голосов
/ 11 января 2020

Вам нужно LEFT JOIN. Неясно, хотите ли вы, чтобы все продукты или все сохранялись скидкамиrulevariants .

В зависимости от того, что вы хотите, это должен быть первый стол. Основываясь на предложении WHERE, я предполагаю, что варианты:

SELECT rv.productid, rv.productvariantid as variantid, 
       p.productnameSE as productname, pv.variantnameSE as variantname, 
       pv.sku, pv.ishidden, pp.picUrl, pp.picid 
FROM dbo.StoreDiscountRuleVariant rv LEFT JOIN
     dbo.Product p 
     ON p.productId = rv.productid LEFT JOIN
     dbo.productVariant pv
     ON pv.variantId = rv.productvariantid OUTER APPLY 
     (SELECT TOP (1) pp.* 
      FROM productpic pp 
      WHERE pp.productid = p.productid
      ORDER BY pp.isfrontpic DESC
     ) pp 
WHERE rv.discountruleid = 16 
ORDER BY rv.productid, pv.sortOrder;

OUTER APPLY тогда подходит для бокового соединения. CORSS APPLY - как INNER JOIN - удалит непревзойденные варианты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...