我需要一个可以缩小搜索范围并组织搜索结果的查询

时间:2019-05-23 20:21:22

标签: mysql sql

我的查询为我提供了我需要的所有信息,但这太多了,我花了太多时间在excel中处理数据。

我需要一个查询,向我显示包含特定SKU(项目)和该顺序中所有其他SKU的订单号。

我还有另一个查询,显示我需要的特定SKU。但是,它消除了该顺序的其他部分。我的查询说,例如,向我显示所有订单“其中im.Sku如'91323-10-0'或im.Sku如'02105-10-0'”

上面的SKU是枕头。假设我订购了一个枕头(91626-10-0)和一件T恤(95523-22-L)。订单号为0999928767463320008。

我当前的查询不会在数据中生成T恤。

select 

p.TrackingNumber
,im.Sku
,convert(text,oh.OrderNumber) as 'OrderNumber'
,convert(date,oh.ShipTime) as 'OrderDate'
,oh.BusinessUnitCode
,oh.OrigShipCode
,oh.ShipCode
,p.ShipWeight
,oh.ShipToRegion

from dmhost.tblOrderHeader oh

join dmhost.tblContainer c on oh.OrderHeaderID = c.OrderHeaderID
join dmhost.tblPackage p on c.ContainerID = p.ContainerID
join dmhost.tblContainerContents cc on c.ContainerID = cc.ContainerID
join dmhost.tblItemMaster im on im.ItemMasterID = cc.ItemMasterID

where (oh.ShipTime between '05/1/2019' and '05/24/2019')
and oh.OrigShipCode like '028'
and  oh.ShipCode like '071'
and (im.Sku like '02105-10-0' or im.Sku like '91323-10-0') --Pillow SKUs

order by oh.OrderNumber

此代码将为我提供19年5月1日至19年5月23日之间运出的所有枕头。

但是,例如,T恤不会出现。

1 个答案:

答案 0 :(得分:-1)

有关子查询的评论是一个很好的答案。通过查看您的查询和5个层次的深度来从给定订单获取sku,您基本上需要重做两次联接的所有表...一次获取内部合格的PQ(PreQuery别名),该PQ(PreQuery别名)根据sku获取DISTNCT订单您正在寻找的#s。有了明确的顺序后,然后返回其余细节,并获取该顺序内的所有组件。

为帮助您节省步骤,我在那儿时已预取了所有ORDER标头字段。这样,您不必只为这些值而返回标题。

select 
        p.TrackingNumber,
        im.Sku,
        pq.OrderNumber',
        pq.OrderDate',
        pq.BusinessUnitCode,
        pq.OrigShipCode,
        pq.ShipCode,
        p.ShipWeight,
        pq.ShipToRegion
    from 
        ( select distinct 
                oh.OrderNumber
                convert(text,oh.OrderNumber) as 'OrderNumber',
                convert(date,oh.ShipTime) as 'OrderDate',
                oh.BusinessUnitCode,
                oh.OrigShipCode,
                oh.ShipCode,
                oh.ShipToRegion
            from 
                dmhost.tblOrderHeader oh
                    join dmhost.tblContainer c 
                        on oh.OrderHeaderID = c.OrderHeaderID
                        join dmhost.tblContainerContents cc 
                            on c.ContainerID = cc.ContainerID
                            join dmhost.tblItemMaster im 
                                on cc.ItemMasterID = im.ItemMasterID
            where 
                    oh.ShipTime between '2019-05-01' and '2019-05-24'
                and oh.OrigShipCode like '028'
                and oh.ShipCode like '071'
                    --Pillow SKUs
                and (im.Sku like '02105-10-0' or im.Sku like '91323-10-0') ) pq
            join dmhost.tblContainer c 
                on pq.OrderHeaderID = c.OrderHeaderID
                join dmhost.tblPackage p 
                    on c.ContainerID = p.ContainerID
                join dmhost.tblContainerContents cc 
                    on c.ContainerID = cc.ContainerID
                    join dmhost.tblItemMaster im 
                        on cc.ItemMasterID = im.ItemMasterID
    order by 
        pq.OrderNumber

如果从订单到sku的关联较短,则可能会缩短该关联。如 OrderHeader-> OrderDetails(项目)-> Items(每个项目都有sku),显然可以使查询更紧凑。

此外,写SQL的个人喜好是缩进。显示表A如何到达表B,以及表B如何到达表C,等等,这给后面的任何人都提供了视觉上的疑问,可以更直观地了解关系。