从三个表中选择

时间:2017-07-31 08:32:18

标签: sql select foreign-keys

我有三个表Product,MapCatProduct,Category。

表定义:

表1:产品

Column 1: int ProductID (PK)
Column 2: nvarchar(255) Name

表2:MapCatProduct

Column 1: int MapCatProductID (PK)
Column 2: int ProductID(FK)
Column 3: int CategoryID(FK)

映射表:类别

Column 1: int CategoryID (PK)
Column 2: nvarchar(255) Name

我希望在输入ProductID时选择Product table参数和categoryID此参数等于所有结果。

用于eaxample: (InputParameters)ProductID = 14

结果:

ProductID = 14 CategoryID = 2

ProductID = 34 CategoryID = 2

ProductID = 63 CategoryID = 2

通知: 一个productID可能有' n'类别ID

我的代码是:

SELECT p.Id,p.Name FROM Product p 
WHERE p.Id = @Id --input parameter
UNION
(SELECT TOP 5 p.Id,p.Name FROM Product p
INNER JOIN MapCatProduct mcp
ON p.Id = mcp.ProductId
INNER JOIN Category c
ON c.Id = mcp.CategoryId)

2 个答案:

答案 0 :(得分:1)

首先应将这些外键的类型更改为外表中使用的相同类型。在这种情况下INT。
对于只保留整数的列,不需要使用大的nvarchar。

之后,您可以将地图表加入其他2个表格 例如:

select 
 prod.ProductID, cat.CategoryID, 
 prod.Name as ProductName, cat.Name as CategoryName
from MapCatProduct map
join Product prod on prod.ProductID = map.ProductID
join Category cat on cat.CategoryID = map.CategoryID
where map.CategoryID in (
   select distinct CategoryID 
   from MapCatProduct
   where ProductID = @ProductId 
)

但是,当然,如果你只需要id,那么只从地图表中选择就足够了。

select ProductID, CategoryID
from MapCatProduct
where CategoryID in (
   select distinct CategoryID 
   from MapCatProduct
   where ProductID = @ProductId 
)

答案 1 :(得分:0)

您希望输入ProductID位于同一类别中的所有ProductID

SELECT ProductID, CategoryID
FROM MapCatProductID
WHERE CategoryID = 
(SELECT DISTINCT CategoryID
FROM MapCatProductID
WHERE ProductID = <input Param>)