按动态关系排序

时间:2013-12-30 20:56:36

标签: sql tsql

我有一张产品表。与产品有多对一的sku表。一个选项表,通过关系表与产品有多对一关系,通过关系表有多对一到sku。选项类型表,具有一对多选项。示例模式

EX

Product
ID   Name
1    dress

ProductOptionRelation
productID optionID displayOrder
1         1        1
1         2        1

Option
ID    Type Name
1     1    Red
2     1    Blue
3     2    0
4     2    2
5     2    4

OptionType
ID  name  displayOrder
1   color 1
2   size  2

Sku
ID productID
1  1
2  1
3  1
4  1
5  1

SkuOptionRelation
skuID OptionID
1     1
1     3
2     1
2     4
3     1
3     5
4     2
4     3
5     2
5     5

如何将所有这些加入,所以我的输出就像

skuID  option
1      red
1      0
2      red
2      2
3      red
3      4
4      blue
4      0
5      blue
5      4

假设所有ID实际上都是uuids并且不能用于排序。除了产品可能有任意数量的选项以外,并非所有产品的选项组合都需要存在。

2 个答案:

答案 0 :(得分:1)

SELECT s.skuID, o.Name
FROM SkuOptionRelation s
INNER JOIN [Option] o ON o.ID = s.OptionID 
INNER JOIN OptionType ot ON ot.ID = o.Type
order by s.skuid, ot.DisplayOrder

结果:

skuID       Name
----------- ----------------
1           Red
1           0
2           Red
2           2
3           Red
3           4
4           Blue
4           0
5           Blue
5           4

(10 row(s) affected)

答案 1 :(得分:0)

除非我遗漏了某些内容,否则您所希望的输出似乎与产品无关。而且只是一个带有选项的sku,这将是......

select so.skuID, o.name
from SkuOptionRelation so
join Option o on so.OptionID = o.ID

如果排序是问题,它来自产品表,那就是......

select so.skuID, o.name
from SkuOptionRelation so
join Option o on so.OptionID = o.ID
join sku s on so.skuID = s.ID
join ProductOptionRelation po on po.productID = s.productID and so.optionID = po.optionID
order by s.ID, po.displayOrder

刚看到另一个答案表明类型顺序也很重要。所以我们现在......

select so.skuID, o.name
from SkuOptionRelation so
join Option o on so.OptionID = o.ID
join OptionType ot on o.type = ot.ID
join sku s on so.skuID = s.ID
join ProductOptionRelation po on po.productID = s.productID and so.optionID = po.optionID
order by s.ID, ot.displayOrder, po.displayOrder