【问题标题】:SQL Server query that both returns items with a foreign key and items that doesn't have itSQL Server 查询既返回具有外键的项目,也返回没有外键的项目
【发布时间】:2020-01-12 01:26:16
【问题描述】:

我有一个折扣页面,我可以在其中添加应该有折扣价的产品。

每个产品下面都会显示许多产品变体,如果它们不应该成为折扣的一部分,则可以取消选中它们。

当我按下保存时,每个“CHECKED”ProductId 和 VariantId 都将存储在一个名为 StoreDiscountRuleVariant 的表中。

如果打开现有折扣页面以进行编辑,那么我的 SQL 查询将不再从 ProductVariant 表中获取未选中的产品变体,而只会获取已保存的“选中”产品。

我希望 SQL 查询既返回在 StoreDiscountRuleVariant 表中具有匹配 variantId 外键的 ProductVariants ,也返回不返回的 ProductVariants。我还需要一个额外的返回列来显示 variantId 是否实际存在于 StoreDiscountRuleVariant 表中 - 例如 isChecked=true/false。

我认为此解决方案比在保存后将已选中和未选中的 variantIds 存储在 StoreDiscountRuleVariant 表中更好,因为在进行此折扣后添加的新 ProductVariants 在编辑时不会显示。

我被指出了这样做的方向:

 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 

结果如下:

第 1 行:

productid: 1326, variantnamese: Vit, sku: FOD46-1, variant.variantid: 822, discountrulevariantid: 572, discountrulevariant.productvariantid: 1035

第 2 行:

productid: 1326, variantnamese: Svart, sku: FOD46-2, variant.variantid: 1035, discountrulevariantid: 572, discountrulevariant.productvariantid: 1035

StoreDiscountRuleVariant 表中仅存在 ROW2/variantid: 1035。 所以至少对我来说奇怪的是,discountrulevariantid 在两行上都指向 1035。 ROW1 的 discountrulevariantid: 值不应该为空,因为 StoreDiscountRuleVariant 中不存在 variantid:822。

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

您需要LEFT JOIN。目前尚不清楚您是想要所有 products 还是所有 storediscountrulevariants

无论你想要什么,这应该是第一张桌子。基于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 -- 会删除不匹配的变体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2013-08-29
    • 2016-12-23
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    相关资源
    最近更新 更多