【问题标题】:select from three table从三个表中选择
【发布时间】:2017-07-31 08:32:17
【问题描述】:

我有三个表 Product、MapCatProduct、Category。

表定义:

表 1:产品

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

表 2:MapCat 产品

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表参数和categoryID这个参数等于所有结果。

例如: (InputParameters) ProductID = 14

结果:

产品 ID = 14 类别 ID = 2

产品 ID = 34 类别 ID = 2

产品 ID = 63 类别 ID = 2

注意: 一个 productID 可能有“n”个 CategoryID

我的代码是:

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)

【问题讨论】:

  • 查看有关 SQL JOINs 的一些信息...试试 here
  • 嗨@gbn。我想使用工会但不工作。选择产品表并联合选择两个表(MapCatProduct,Category)。
  • @Awatt UNION 操作不同于使用结合来自两个或多个表的列的连接。请给我们看一个代码示例。

标签: sql select foreign-keys


【解决方案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 
)

【讨论】:

  • 感谢@LukStorm。这行得通! “键入外键写了一个错误,被编辑了。”
【解决方案2】:

您希望输入ProductID 上的所有ProductID 都属于同一类别吗?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多