我需要一些关于如何更有效地查询数据库的建议。
情况可以这样解释。如果客户进入商店并购买在[销售表]中创建销售的商品,则此表通过交易参考链接到[交易表],但可能会购买多个商品,每个商品在[产品表]。
除此之外,还有两个促销表,用于指示产品是在价格促销[促销]还是在多重促销[销售标志]上。这两个都链接回销售表。
我希望能够将所有行恢复,以便其中一个促销中的每笔交易都可用。
条件如下工作
Product ¦ Price promo (promotions-promotion no) ¦Multibuy(salesflag-On promotion)
-----------------------------------
1.Product A -1 0 = neither price promo nor multibuy
2.Product B -1 1 = multibuy only ie 0 false 1 true
3.Product C 8245 0 = price promo only can be any number other than -1
这是三种情况,但它们都可能在一次客户交易中发生。 那么,如果有产品B和C的情况,我如何检查每笔交易,如果存在,则返回整个篮子?
我所能想到的只是在where子句中进一步选择,但这将返回所有相关的交易号码,然后主查询将在整个数据库中搜索这些交易号码,这似乎是一个非常漫长的方式,因为它是我正在研究的一个巨大的数据库+我现在是相当基础的SQL。
SELECT
TRANS.TransactionReference
,TRANS.TID
,CONVERT(VARCHAR(10),T.Day,103) as 'Date'
,PROD.HierarchyLevel2
,PROD.HierarchyLevel3
,PROD.HierarchyLevel4
,PROD.ProductDescription
,PROD.ExternalProductCode
,PROD.Size
,CUST.CardNumber
,S.SalesQty /*unless Group everything somehow will get multiple lines per qty sold all with qty of 1*/
,S.SalesValue
,STOR.Area
,STOR.StoreCode
,STOR.StoreName
FROM Reporting.Sales as S
INNER JOIN Reporting.Products as PROD
on S.ProductID = PROD.ProductID
INNER JOIN Reporting.Time as T
on S.DateID = T.DateID
INNER JOIN Reporting.Stores as STOR
on S.StoreID = STOR.StoreID
INNER JOIN Reporting.Promotions as PROM
on S.PromotionID = PROM.PromotionID
INNER JOIN Reporting.SalesFlags as FLAG
on S.SalesFlagID = FLAG.SalesFlagID
INNER JOIN Reporting.Transactions as TRANS
on S.TID = TRANS.TID
INNER JOIN Reporting.Customers as CUST
on S.CustomerID = CUST.CustomerID
WHERE
T.Day BETWEEN '2014-01-23' and '2014-02-11'
AND TRANS.TransactionReference IN(SELECT distinct TRANS.TransactionReference
FROM Reporting.Sales as S
INNER JOIN Reporting.Transactions as TRANS
on S.TID = TRANS.TID
INNER JOIN Reporting.Promotions as PROM
on S.PromotionID = PROM.PromotionID
INNER JOIN Reporting.SalesFlags as FLAG
on S.SalesFlagID = FLAG.SalesFlagID
INNER JOIN Reporting.Time as T
on S.DateID = T.DateID
WHERE
PROM.PromotionNumber = '-1'
AND FLAG.OnPromotion = 1)
AND T.Day BETWEEN '2014-01-23' and '2014-02-11'
ORDER BY
TRANS.TransactionReference
上面只考虑到一个篮子包含多重购买的销售情况,而我还没有通过如何将销售包括在篮子中也可以包含价格促销。但是我已经离开查询10分钟而没有得到任何结果 - 只是继续运行。
我使用的内部联接我认为都是主键,因为数据库已经巧妙地设置为通过此表中内置的键链接到sales表。
提前致谢,
亲切的问候,
亚当。