我有一张包含产品列表的表格。
我有一张包含商家列表的表格。
我有一张包含仓库列表的表格。
我有一个 WarehouseMerchant 表,因此一个仓库可以分配许多商家。
我有一个 WarehouseMerchantProduct 表,因此商家可以将其产品列在仓库中
我有一个可以链接 2 个商家的商家链接表
MerchantLinkID int
MasterMerchantID int
LinkedMerchantID int
PreferenceOrder int
我需要做的是传入产品 ID 并获取可以销售它的商家产品的唯一列表。
4 条规则
- 如果商家有关联的商家也销售该产品,则不要显示关联的商家产品
- 如果商户有关联商户也销售该产品,但主商户库存水平为0,则只显示关联商户产品
- 如果一个商家在多个仓库有库存,那么在仓库Merchant Table 中有一个偏好顺序来选择使用哪一个
- 全部运行后,每个商家应该只有一种产品
我一直在绞尽脑汁想找出解决办法。我沿着光标的路线走,但它变得有点笨拙。然后我得到了 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 缺货)