我坚持如何缩小与多个ID相关的行选择范围。这是我的数据问题如下:
|Widget | |Widget Category | |Part Category | |Part |
+---------+ +--------------------+ +--------------+ +-------------+
|Id|Name | |WidId|CatId|CatName | |PartId| CatId | |Id|Name |
+---------+ +-----+-----+--------+ +------+-------+ +--+----------+
| 1|item01| | 1| 1|Windows | | 1| 1| | 1|Glass |
| 2|item02| | 2| 1|Windows | | 1| 2| | 2|Door Frame|
| 3|item03| | 3| 1|Windows | | 2| 2| | 3|Wheel |
| 4|item04| | 1| 2|Door | | 4| 2| | 4|Handle |
| 5|item05| | 5| 2|Door |
| 6|item06| | 6| 3|Trunk |
一个或多个小部件可以位于小部件类别中。许多小部件类别可以包含许多部件类别。许多零件可以是许多零件类别的一部分。我需要知道哪些部件链接到什么Widgets。所以我们知道Item01的零件是“Glass”,而Item05的零件是“Glass,Door Frame,and Handle”。
这是我到目前为止的SQL,但我需要它是动态的,因此它可以每周在存储过程上运行一次。
---- This gives me the Correct number of Widgets to Parts based on set of 2 category ID's as a quick and static hack
SELECT W.Id
FROM Widget W
INNER JOIN dbo.[WidgetCategory] WC1 ON WC1.WidId = W.Id
INNER JOIN dbo.[WidgetCategory] WC2 ON WC2.WidId = W.Id
WHERE WC1.CatId = 1 AND WC2.CatId = 2
GROUP BY W.Id
上述查询的原因是获得一个表格结构,该表格结构按PartId分组为WidgetId,作为两个相关类别和所有与零件相关的小部件的交集。下面的表格是我想要获得的,以便我可以聚合一个部件中的多少小部件(COUNT(WidId)GROUP BY PartId):
|WidId|PartId|WidgetName|
+-----+------+----------+
| 1| 1| Item01|
| 2| 1| Item02|
| 3| 1| Item03|
| 1| 2| Item01|
| 5| 2| Item05|
更新的问题:如何从上表中获得此响应,只返回两个类别的交集?
|WidId|PartId|WidgetName|
+-----+------+----------+
| 1| 1| Item01|
| 1| 2| Item01|
任何帮助将不胜感激!对不起,我不得不在我离开周末之前快速发帖。
编辑:抱歉,关于ProductId,是我正在使用的一些SQL遗留下来的。应该是Widget Id。增加了问题的清晰度,并增加了我遇到的附加问题。
答案 0 :(得分:1)
我认为您需要这样的查询。
SELECT DISTINCT w.WidId, p.ParId, w.Name
FROM Widget w
JOIN WidgetCategory wc ON wc.WidId=w.Id
JOIN PartCategory pc ON pc.CatId=wc.CatId
JOIN Part p ON p.Id=pc.ParId
我不明白为什么你需要在WidgetCategory表上加入两次。您需要的是通过加入PartCategory表来访问Part表。
你为什么要分组?如果您需要所有部件,则无法进行分组,除非您使用某些特定的SQL功能来连接单个行中的所有部件。这可能是也可能不可能,具体取决于您使用的数据库引擎。
我添加了DISTINCT,以防你有多种方法从Widget X到Part Y ......这足以删除重复项。除非您需要COUNT或对聚合执行其他操作,否则不需要GROUP BY。