检索在SQL中共享多个ID的行

时间:2014-07-25 21:05:52

标签: sql sql-server

我坚持如何缩小与多个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。增加了问题的清晰度,并增加了我遇到的附加问题。

1 个答案:

答案 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。