2

我有一张包含产品列表的表格。
我有一张包含商家列表的表格。
我有一张包含仓库列表的表格。

我有一个 WarehouseMerchant 表,因此一个仓库可以分配许多商家。

我有一个 WarehouseMerchantProduct 表,因此商家可以将其产品列在仓库中

我有一个可以链接 2 个商家的商家链接表

MerchantLinkID      int 
MasterMerchantID    int 
LinkedMerchantID    int 
PreferenceOrder     int 

我需要做的是传入产品 ID 并获取可以销售它的商家产品的唯一列表。

4 条规则

  1. 如果商家有关联的商家也销售该产品,则不要显示关联的商家产品
  2. 如果商户有关联商户也销售该产品,但主商户库存水平为0,则只显示关联商户产品
  3. 如果一个商家在多个仓库有库存,那么在仓库Merchant Table 中有一个偏好顺序来选择使用哪一个
  4. 全部运行后,每个商家应该只有一种产品

我一直在绞尽脑汁想找出解决办法。我沿着光标的路线走,但它变得有点笨拙。然后我得到了 4 条规则作为要求,这让我回到了绘图板上。

如果有人可以为此想到一个快速且简单(ish)的基于集合的解决方案,那么我很乐意听到它。

这是创建表和关系的脚本

 CREATE TABLE [dbo].[MW_Merchant](
    [MerchantID] [int] IDENTITY(1,1) NOT NULL,
    [MerchantName] [nvarchar](150) NOT NULL,
    [MerchantCode] [char](10) NOT NULL,
    [Active] [bit] NOT NULL,
 CONSTRAINT [PK_Merchant] PRIMARY KEY CLUSTERED 
(
    [MerchantID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [ucMerchantCode] UNIQUE NONCLUSTERED 
(
    [MerchantCode] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[MW_Warehouse]    Script Date: 04/30/2013 09:17:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[MW_Warehouse](
    [WarehouseID] [int] IDENTITY(1,1) NOT NULL,
    [WarehouseName] [nvarchar](150) NOT NULL,
    [WarehouseCode] [varchar](10) NOT NULL,
    [Active] [bit] NOT NULL,
 CONSTRAINT [PK_Warehouse] PRIMARY KEY CLUSTERED 
(
    [WarehouseID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[MW_WarehouseMerchantProduct]    Script Date: 04/30/2013 09:17:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[MW_WarehouseMerchantProduct](
    [WarehouseMerchantProductID] [int] IDENTITY(1,1) NOT NULL,
    [WarehouseID] [int] NOT NULL,
    [MerchantID] [int] NOT NULL,
    [ProductCode] [varchar](30) NOT NULL,
    [StockLevel] [int] NOT NULL,
    [Active] [bit] NOT NULL,
    [PriorityOrder] [int] NOT NULL,
 CONSTRAINT [PK_MW_WarehouseProduct] PRIMARY KEY CLUSTERED 
(
    [WarehouseMerchantProductID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[MW_WarehouseMerchant]    Script Date: 04/30/2013 09:17:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MW_WarehouseMerchant](
    [WarehouseMerchantID] [int] IDENTITY(1,1) NOT NULL,
    [WarehouseID] [int] NOT NULL,
    [MerchantID] [int] NOT NULL,
    [Active] [bit] NOT NULL,
    [PreferenceOrder] [int] NOT NULL,
 CONSTRAINT [PK_MW_WarehouseMerchant] PRIMARY KEY CLUSTERED 
(
    [WarehouseMerchantID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[MW_MerchantLink]    Script Date: 04/30/2013 09:17:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MW_MerchantLink](
    [MerchantLinkID] [int] IDENTITY(1,1) NOT NULL,
    [MasterMerchantID] [int] NOT NULL,
    [LinkedMerchantID] [int] NOT NULL,
    [PreferenceOrder] [int] NOT NULL,
 CONSTRAINT [PK_MW_MerchantLink] PRIMARY KEY CLUSTERED 
(
    [MerchantLinkID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Default [DF_MW_WarehouseMerchant_PreferenceOrder]    Script Date: 04/30/2013 09:17:39 ******/
ALTER TABLE [dbo].[MW_WarehouseMerchant] ADD  CONSTRAINT [DF_MW_WarehouseMerchant_PreferenceOrder]  DEFAULT ((10)) FOR [PreferenceOrder]
GO
/****** Object:  Default [DF_MW_WarehouseMerchantProduct_PriorityOrder]    Script Date: 04/30/2013 09:17:39 ******/
ALTER TABLE [dbo].[MW_WarehouseMerchantProduct] ADD  CONSTRAINT [DF_MW_WarehouseMerchantProduct_PriorityOrder]  DEFAULT ((10)) FOR [PriorityOrder]
GO
/****** Object:  ForeignKey [FK_MW_MerchantLink_MW_Merchant]    Script Date: 04/30/2013 09:17:39 ******/
ALTER TABLE [dbo].[MW_MerchantLink]  WITH CHECK ADD  CONSTRAINT [FK_MW_MerchantLink_MW_Merchant] FOREIGN KEY([MasterMerchantID])
REFERENCES [dbo].[MW_Merchant] ([MerchantID])
GO
ALTER TABLE [dbo].[MW_MerchantLink] CHECK CONSTRAINT [FK_MW_MerchantLink_MW_Merchant]
GO
/****** Object:  ForeignKey [FK_MW_MerchantLink_MW_Merchant1]    Script Date: 04/30/2013 09:17:39 ******/
ALTER TABLE [dbo].[MW_MerchantLink]  WITH CHECK ADD  CONSTRAINT [FK_MW_MerchantLink_MW_Merchant1] FOREIGN KEY([LinkedMerchantID])
REFERENCES [dbo].[MW_Merchant] ([MerchantID])
GO
ALTER TABLE [dbo].[MW_MerchantLink] CHECK CONSTRAINT [FK_MW_MerchantLink_MW_Merchant1]
GO
/****** Object:  ForeignKey [FK_MW_WarehouseMerchant_MW_Merchant]    Script Date: 04/30/2013 09:17:39 ******/
ALTER TABLE [dbo].[MW_WarehouseMerchant]  WITH CHECK ADD  CONSTRAINT [FK_MW_WarehouseMerchant_MW_Merchant] FOREIGN KEY([MerchantID])
REFERENCES [dbo].[MW_Merchant] ([MerchantID])
GO
ALTER TABLE [dbo].[MW_WarehouseMerchant] CHECK CONSTRAINT [FK_MW_WarehouseMerchant_MW_Merchant]
GO
/****** Object:  ForeignKey [FK_MW_WarehouseMerchant_MW_Warehouse]    Script Date: 04/30/2013 09:17:39 ******/
ALTER TABLE [dbo].[MW_WarehouseMerchant]  WITH CHECK ADD  CONSTRAINT [FK_MW_WarehouseMerchant_MW_Warehouse] FOREIGN KEY([WarehouseID])
REFERENCES [dbo].[MW_Warehouse] ([WarehouseID])
GO
ALTER TABLE [dbo].[MW_WarehouseMerchant] CHECK CONSTRAINT [FK_MW_WarehouseMerchant_MW_Warehouse]
GO
/****** Object:  ForeignKey [FK_MW_WarehouseMerchantProduct_MW_Merchant]    Script Date: 04/30/2013 09:17:39 ******/
ALTER TABLE [dbo].[MW_WarehouseMerchantProduct]  WITH CHECK ADD  CONSTRAINT [FK_MW_WarehouseMerchantProduct_MW_Merchant] FOREIGN KEY([MerchantID])
REFERENCES [dbo].[MW_Merchant] ([MerchantID])
GO
ALTER TABLE [dbo].[MW_WarehouseMerchantProduct] CHECK CONSTRAINT [FK_MW_WarehouseMerchantProduct_MW_Merchant]
GO
/****** Object:  ForeignKey [FK_MW_WarehouseProduct_MW_Warehouse]    Script Date: 04/30/2013 09:17:39 ******/
ALTER TABLE [dbo].[MW_WarehouseMerchantProduct]  WITH CHECK ADD  CONSTRAINT [FK_MW_WarehouseProduct_MW_Warehouse] FOREIGN KEY([WarehouseID])
REFERENCES [dbo].[MW_Warehouse] ([WarehouseID])
GO
ALTER TABLE [dbo].[MW_WarehouseMerchantProduct] CHECK CONSTRAINT [FK_MW_WarehouseProduct_MW_Warehouse]
GO

以及一些测试数据

/****** Object:  Table [dbo].[MW_Merchant]    Script Date: 04/30/2013 09:41:50 ******/
SET IDENTITY_INSERT [dbo].[MW_Merchant] ON
INSERT [dbo].[MW_Merchant] ([MerchantID], [MerchantName], [MerchantCode], [Active]) VALUES (24, N'Merchant 1', N'MERCH1    ', 1)
INSERT [dbo].[MW_Merchant] ([MerchantID], [MerchantName], [MerchantCode], [Active]) VALUES (27, N'Merchant 2', N'MERCH2    ', 1)
INSERT [dbo].[MW_Merchant] ([MerchantID], [MerchantName], [MerchantCode], [Active]) VALUES (28, N'Merchant 3', N'MERCH3    ', 1)
SET IDENTITY_INSERT [dbo].[MW_Merchant] OFF
/****** Object:  Table [dbo].[MW_Warehouse]    Script Date: 04/30/2013 09:41:50 ******/
SET IDENTITY_INSERT [dbo].[MW_Warehouse] ON
INSERT [dbo].[MW_Warehouse] ([WarehouseID], [WarehouseName], [WarehouseCode], [Active]) VALUES (12, N'Warehouse 1', N'WARE1', 1)
INSERT [dbo].[MW_Warehouse] ([WarehouseID], [WarehouseName], [WarehouseCode], [Active]) VALUES (13, N'Warehouse 2', N'WARE2', 1)
INSERT [dbo].[MW_Warehouse] ([WarehouseID], [WarehouseName], [WarehouseCode], [Active]) VALUES (14, N'Warehouse 3', N'WARE3', 1)
SET IDENTITY_INSERT [dbo].[MW_Warehouse] OFF
/****** Object:  Table [dbo].[MW_WarehouseMerchantProduct]    Script Date: 04/30/2013 09:41:50 ******/
SET IDENTITY_INSERT [dbo].[MW_WarehouseMerchantProduct] ON
INSERT [dbo].[MW_WarehouseMerchantProduct] ([WarehouseMerchantProductID], [WarehouseID], [MerchantID], [ProductCode], [StockLevel], [Active], [PriorityOrder]) VALUES (93, 13, 24, N'TESTPRODUCT', 20, 1, 10)
INSERT [dbo].[MW_WarehouseMerchantProduct] ([WarehouseMerchantProductID], [WarehouseID], [MerchantID], [ProductCode], [StockLevel], [Active], [PriorityOrder]) VALUES (96, 14, 24, N'TESTPRODUCT', 20, 1, 10)
INSERT [dbo].[MW_WarehouseMerchantProduct] ([WarehouseMerchantProductID], [WarehouseID], [MerchantID], [ProductCode], [StockLevel], [Active], [PriorityOrder]) VALUES (97, 14, 27, N'TESTPRODUCT', 10, 1, 10)
SET IDENTITY_INSERT [dbo].[MW_WarehouseMerchantProduct] OFF
/****** Object:  Table [dbo].[MW_MerchantLink]    Script Date: 04/30/2013 09:41:50 ******/
SET IDENTITY_INSERT [dbo].[MW_MerchantLink] ON
INSERT [dbo].[MW_MerchantLink] ([MerchantLinkID], [MasterMerchantID], [LinkedMerchantID], [PreferenceOrder]) VALUES (22, 24, 27, 1)
INSERT [dbo].[MW_MerchantLink] ([MerchantLinkID], [MasterMerchantID], [LinkedMerchantID], [PreferenceOrder]) VALUES (23, 24, 28, 2)
SET IDENTITY_INSERT [dbo].[MW_MerchantLink] OFF

在示例数据中,我返回的行应该是 WarehouseMerchantProductID 93 93,96 和 97 都有库存,但是

93和96属于同一个商家,应该根据WarehouseMerchant表中的PreferenceOrder来选择

商家 27 与 24 相关联,因此不应出现(除非 24 缺货)

4

1 回答 1

0

请注意,以下查询是为 Oracle 编写的,并假设 LinkedMerchant 只有 1 个 MasterMerchant。您可以在此处使用代码。另请注意,为了测试一些额外的案例,我包含的测试数据比您提供的更多。

SELECT MERCHANTID, WAREHOUSEID, PRODUCTCODE
FROM (
  SELECT 0
  , WMP.MERCHANTID
  , WMP.WAREHOUSEID
  , WMP.PRODUCTCODE
  , RANK() OVER (PARTITION BY ML.MASTERMERCHANTID, WMP.PRODUCTCODE ORDER BY ML.PREFERENCEORDER ASC NULLS LAST) MERCH_RANK
  , RANK() OVER (PARTITION BY WMP.MERCHANTID, WMP.PRODUCTCODE ORDER BY WM.PREFERENCEORDER ASC NULLS LAST) WARE_RANK
  FROM MW_WAREHOUSEMERCHANTPRODUCT WMP
    LEFT OUTER JOIN MW_WAREHOUSEMERCHANT WM ON 0=0
                AND WMP.MERCHANTID  = WM.MERCHANTID
                AND WMP.WAREHOUSEID = WM.WAREHOUSEID
    LEFT OUTER JOIN MW_MERCHANTLINK ML ON 0=0
                AND WMP.MERCHANTID = ML.LINKEDMERCHANTID
    LEFT OUTER JOIN MW_WAREHOUSEMERCHANTPRODUCT MASTER ON 0=0
                AND ML.MASTERMERCHANTID = MASTER.MERCHANTID
                AND WMP.PRODUCTCODE     = MASTER.PRODUCTCODE
  WHERE 0=0
    AND WMP.STOCKLEVEL > 0
    AND NVL(MASTER.STOCKLEVEL, 0) <= 0
)
WHERE 0=0
  AND MERCH_RANK = 1
  AND WARE_RANK  = 1
;
于 2013-05-23T02:41:49.190 回答