我有以下表格,我添加了一些数据:
create table dbo.Products
(
Id int identity not null primary key clustered (Id),
Name nvarchar (120) not null,
Price decimal (19,4) not null
);
create table dbo.AllowedQuantities
(
Id int identity not null primary key clustered (Id),
Quantity float not null
);
create table dbo.ProductsAllowedQuantities
(
ProductId int not null,
QuantityId int not null,
constraint ProductIdQuantityId primary key clustered (ProductId, QuantityId)
);
alter table dbo.ProductsAllowedQuantities
add constraint CProductId foreign key (ProductId) references Products(Id),
constraint CQuantityId foreign key (QuantityId) references AllowedQuantities(Id);
insert into dbo.AllowedQuantities (Quantity) VALUES (0.5), (1), (2)
insert into dbo.Products (Name, Price) VALUES ('A', 400), ('B', 500), ('C', 800), ('D', 1000), ('E', 1200), ('F', 1400)
insert into dbo.ProductsAllowedQuantities (ProductId, QuantityId) VALUES (1, 1), (1, 2)
insert into dbo.ProductsAllowedQuantities (ProductId, QuantityId) VALUES (2, 1)
insert into dbo.ProductsAllowedQuantities (ProductId, QuantityId) VALUES (3, 1), (3, 3)
insert into dbo.ProductsAllowedQuantities (ProductId, QuantityId) VALUES (4, 2), (4, 3)
insert into dbo.ProductsAllowedQuantities (ProductId, QuantityId) VALUES (5, 1), (5, 3)
insert into dbo.ProductsAllowedQuantities (ProductId, QuantityId) VALUES (6, 2)
我使用了以下查询:
select p.Name, p.Price, aq.Quantity, TotalPrice = p.Price * aq.Quantity
from dbo.Products as p
join dbo.ProductsAllowedQuantities as paq
on p.Id = paq.ProductId
join dbo.AllowedQuantities aq
on paq.QuantityId = aq.Quantity
得到以下数据:
注意1 奇怪的是,Quantity = 0.5没有出现......我缺少什么?
目标
鉴于总价格TP = {700,1900},我需要为每一个找到一个随机产品。
对于给定的每个总价格,我设置了+/- 200的范围。所以范围是:
700> [500,900]
1900> [1700,2100]
查看表格,我看到符合这些条件的值:
700> [500,900]>第2行到第4行 1900> [1700,2100]>第5行
所以我会选择一个随机的2到4行和第5行。
注意2 如果可能,我希望每个选择包含不同的行。
所以,如果解决方案是:
700> [500,900]>第2行到第4行 1900> [1700,2100]>第4行和第5行
如果选择第4行,我只想选择一次。
我不确定这是否可能......
所以我正在寻找最有效的方法。
如果有必要,可以通过更改方案来改进我的数据库,或者添加一些索引......
答案 0 :(得分:-1)
数据库方案非常好。您可能必须添加一些索引,但我无法找到任何方法来改进数据库架构以提高效率。
查询少数几行应该没什么大不了的,所以我不认为,你甚至担心效率。