Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server查询,既返回带外键的项,又返回不带';我没有_Sql_Sql Server_Tsql - Fatal编程技术网

SQL Server查询,既返回带外键的项,又返回不带';我没有

SQL Server查询,既返回带外键的项,又返回不带';我没有,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个折扣页面,我可以添加应该有折扣价格的产品 每种产品都会在其下方显示一些产品变体,如果它们不属于折扣的一部分,则可以取消选中这些变体 当我按下save键时,每个“选中”的ProductId和VariantId将存储在一个名为StoreDiscontruleVariant的表中 如果打开现有折扣页进行编辑,则我的SQL查询不再从ProductVariant表中获取未检查的产品变体,而只获取已保存的“已检查”的产品变体 我希望SQL查询既返回在StoreDiscountRuleVariant表

我有一个折扣页面,我可以添加应该有折扣价格的产品

每种产品都会在其下方显示一些产品变体,如果它们不属于折扣的一部分,则可以取消选中这些变体

当我按下save键时,每个“选中”的ProductId和VariantId将存储在一个名为StoreDiscontruleVariant的表中

如果打开现有折扣页进行编辑,则我的SQL查询不再从ProductVariant表中获取未检查的产品变体,而只获取已保存的“已检查”的产品变体

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

我认为这种解决方案比在保存后将选中的和未选中的Variatid存储在
StoreDiscountRuleVariant
表中要好,因为在进行此折扣后添加的新ProductVariant在编辑时不会显示

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

 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,VariantName:Vit,sku:FOD46-1,variant.variantid:822,discountrulevariantid:572,discountrulevariantid:1035

第2行:

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

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

您需要一个
左连接
。目前尚不清楚您是想要所有产品还是所有StoreDiscountrules变体

无论你想要什么,那都应该是第一张桌子。基于
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;

外部应用
适用于横向连接
CORSS-APPLY
——就像
内部连接
——将删除不匹配的变体。

使用左连接而不是内部连接