我一直在试图找出如何查询购物车数据库,以查找包含未分配UPS跟踪标签的有形物品(物品可以下载,因此,不可发货)的所有订单。我做不到。
相关表格如下:
// dbo.Inventory - details about the individual product being sold
- ProductID int primary - Name nvarchar - IsDownloadable bit -
| 5 | Awesome Shirt | 0 |
| 7 | An Audio Track | 1 |
// dbo.ShoppingCart --("ShopID" groups the items in the cart)
- CartID int primary - ProductID int - ShopID char (guid) - Quantity int -
| 2 | 5 | e854a982c9264a72 | 4 |
| 3 | 7 | e854a982c9264a72 | 1 |
// dbo.Orders - Order information (shipping address, etc)
- OrderID int primary - ShopID char(x) - BillingInfoColumns -
| 13 | e854a982c9264a72 | Name,Address,etc |
// dbo.Tracking - Shipments' (note: a shipment can contain several items) tracking numbers
- TrackingID int primary - OrderID int - TrackingNumber char(x) -
| 5 | 13 | Ze5Whatever... |
// dbo.ShippedItems - Maps a ShoppingCart's shipped items to tracking numbers
- ShippingID int primary - TrackingID int - CartID int - QuantityInShipment int
| 6 | 5 | 2 | 3 |
希望上面提供了一个如何设计数据库的合理的近似值。
所以,为了澄清我
认为
我需要:
-
选择尚未发货所有有形项目的所有订单ID。
-
非有形物品可下载=1
-
必须考虑ShoppingCart.Quantity列。如果我们订购4件T恤,我们可以把它们放在一个盒子里(带有一个UPS跟踪标签)。然后,我们可以每盒放2个。或者我们可以把一条牛仔裤和一件衬衫放在同一个盒子里(同样,有一个跟踪标签)。
我一直在用无止境的连接来编造废话,并且在(select*from)s中不存在的地方嵌套也没有用。可悲的是,我似乎无法将我的头环绕在它周围……我仍在等待我的发现时刻。
我对SQL和数据库设计比较陌生,所以任何信息或(建设性的)批评都会受到极大的赞赏。如果您认为这会有所帮助,那么您可以随意在数据库本身的设计中钻出一些漏洞。-)
// I wish I could run this on my brain right now...
// (Neurons, apparently, are "excitable")
UPDATE Brain SET Neuron = 'Excited' WHERE Cortex = 'SQL'
更新
感谢贝诺伊特·维迪斯,这就是我想出来的。这是我对实际表/数据使用的实际查询:
SELECT
d.OrderID
FROM
Person.ShoppingCart c
JOIN
Inventory.Item i
ON
i.ItemID = c.ItemID
JOIN
Orders.Details d
ON
d.ShopID = c.ShopID
LEFT JOIN
Orders.Shipping s
ON
d.OrderID = s.OrderID
LEFT JOIN
Orders.ShippedItems si
ON
s.ShippingID = si.ShippingID
WHERE
i.DownloadableMedia = 0 AND
d.Billed = 1 AND
d.Ordered = 1
GROUP BY
d.OrderID
HAVING
SUM(c.Quantity) > CASE WHEN SUM(si.Quantity) IS NULL THEN 0 ELSE SUM(si.Quantity) END