复杂场景的SQL语法(交易)

时间:2010-06-07 13:09:04

标签: sql join

我有一个复杂的查询要写,但无法弄明白

这是我的表格

  

销售 - 系统中每笔销售的一行
  SaleProducts - 发票中每行的一行(类似于NW中的OrderDetails)
  交易 - 销售可能有权获得的可能交易/优惠清单
  DealProducts - 为获得交易必须购买的产品数量列表

现在我试图提出一个查询,告诉我每次销售他可能得到的交易

相关领域是:

  

销售:SaleID(PK)
  销售产品:SaleID(FK),产品ID(FK)
  交易:DealID(PK)
  DealProducts:DealID(FK),ProductID(FK),Mandatories(int)所需数量

我相信我应该可以使用某种交叉连接或外连接,但它不起作用

这是一个样本(我试过的约30件事)

SELECT  DealProducts.DealID, DealProducts.ProductID, DealProducts.Mandatories, 
        viwSaleProductCount.SaleID, viwSaleProductCount.ProductCount
FROM    DealProducts 
            LEFT OUTER JOIN viwSaleProductCount 
                ON DealProducts.ProductID = viwSaleProductCount.ProductID
GROUP BY DealProducts.DealID, DealProducts.ProductID, DealProducts.Mandatories, 
         viwSaleProductCount.SaleID, viwSaleProductCount.ProductCount

问题是它没有显示任何未满足的产品交易(可能是因为ProductID连接)。我还需要显示没有要求的销售,然后我可以过滤掉此查询中存在的任何SaleID where AmountBought < Mandatories

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

我不确定我对你的问题有多好(viwSaleProductCount适合哪里?)但听起来你需要一个外部联接到一个子查询,它返回一个交易列表及其相关产品。我认为它会是这样的:

Select *
From Sales s Inner Join SaleProducts sp on s.SaleID = sp.SaleID
    Left Join (
        Select *
        From Deals d Inner Join DealProducts dp on d.DealID = dp.DealId
    ) as sub on sp.ProductID = sub.ProductID

您可能需要添加逻辑以确保交易不会出现两次,当然会将*替换为您在所有情况下都需要的特定列名。

编辑:如果您实际上不需要销售或交易表中的任何信息,可以使用以下内容:

Select sp.SaleID, sp.ProductID, sp.ProductCount, dp.DealID, dp.Mandatories
From SaleProducts sp
    Left Join DealProducts as dp on sp.ProductID = dp.ProductID

如果您需要对此结果进行分组/汇总,则需要小心确保特定销售不会多次计算交易(Count Distinct可能是合适的,具体取决于您的分组)。因为它是一个左连接,所以您不必担心排除在DealProducts中没有匹配的销售。