查找在SQL中使用多对多关系的表的交集

时间:2014-07-30 15:13:18

标签: sql sql-server

我需要获得两个表的交集,这两个表使用两个多对多表来相互关联。示例表如下:

**Discount**                **DiscountRef**                **ProductCat**     **Product**
|DisId| Discount|Amount|    |DisId|RefType|RefId|IsActive|    |ProdId|CatId|    |ProdId|      ProdName|ProdPrice|
+-----+---------+------+    +-----+-------+-----+--------+    +------+-----+    +------+--------------+---------+
|    1|   2% Off|  0.02|    |    1|Product| 9004|       0|    |  9001| 3456|    |  9001|       9" Nail|     0.50|
|    2|  10% Off|  0.10|    |    2|Product| 9002|       0|    |  9002| 3456|    |  9002|    2"x4" Stud|     2.50|
|    3|  25% Off|  0.25|    |    2|   PCat| 3456|       1|    |  9005| 3456|    |  9003|   Claw Hammer|     5.99|
|    4|  2 for 1|  0.50|    |    3|   PCat| 7346|       1|    |  9001| 7346|    |  9004|     Wood Glue|     1.20|
|    5|Clearance|  0.75|    |    3|   PCat| 4455|       1|    |  9003| 7346|    |  9005|6'x4' Dry Wall|    10.39|
                            |    5|Product| 9004|       0|    |  9003| 4455|    |  9006|   Screwdriver|     4.25|
                                                              |  9006| 4455|

使用这些表格,我需要获得相同折扣ID下的产品类别的交集。下表是我需要得到的:

|DisId|ProdId|DisPrice|
+-----+------+--------+
|    2|  9001|    0.45|
|    2|  9002|    2.25|
|    2|  9005|    9.36|
|    3|  9003|    4.50|

我尝试过几种不同的方法,但似乎无法进入那张桌子。下面的SQL返回给我的折扣,它有多个类别应用于它。

SELECT DR.DisId, PC.CatId
FROM DiscountRef DR
INNER JOIN (
    SELECT DisId
    FROM DiscountRef
    GROUP BY DisId
    HAVING COUNT(DisId) > 1
) SDR ON SDR.DisId = DR.DisId
INNER JOIN ProductCat PC ON PC.CatId = DR.RefId AND DR.RefType = 'PCat'
GROUP BY DR.DisId, PC.CateId

表返回:

|DisId|CatId|
+-----+-----+
|    3| 7346|
|    3| 4455|

然后使用产品类别Id与产品表的交叉点,我得到正确数量的产品ID。

SELECT P1.ProdId
FROM Product P1
INNER JOIN ProdCat PC1 ON PC1.ProdId = P1.ProdId AND PC1.CategoryId = 7346
INTERSECT
SELECT P2.ProdId
FROM Product P2
INNER JOIN ProdCat PC2 ON PC2.ProdId = P2.ProdId AND PC2.CategoryId = 4455

此外,折扣可以有两个以上的类别(缩小产品数量),有时还有一个以上的折扣活动(此处省略折扣数据,但会进行检查)。

有关如何获得上面所需表格的任何帮助?

编辑:如果DiscountRef表上有多个DisId且它们恰好是PCat类型,则它们是在所有类别中共享的产品。就像Claw Hammer是CatId 7346和CatId 4455中唯一出现的项目一样。

0 个答案:

没有答案