【问题标题】:SQL Server : query for obtaining products from nested categories hierarchySQL Server:从嵌套类别层次结构中获取产品的查询
【发布时间】:2014-04-15 16:32:28
【问题描述】:

我的 SQL 查询有问题。我这里有两个 SQL Server 表。

第一个:

CREATE TABLE [category].[Categories](
    [Id] [bigint] IDENTITY(1,1) NOT NULL, -- PRIMARY KEY
    [Name] [nvarchar](200) NOT NULL,
    [ParentId] [bigint] NULL -- CONSTRAINT [FK_Categories_Categories] FOREIGN KEY([ParentId])
);

第二个是:

CREATE TABLE [product].[Products](
    [Id] [bigint] IDENTITY(1,1) NOT NULL, -- PRIMARY KEY
    [Name] [nvarchar](250) NOT NULL,
    [CategoryId] [bigint] NOT NULL, -- CONSTRAINT [FK_Products_Categories] FOREIGN KEY([CategoryId])
    [Description] [nvarchar](500) NULL,
    [ManufacturerUrl] [nvarchar](1000) NULL,
    [ImageUrl] [nvarchar](1000) NULL,
    [Price] [money] NOT NULL
);

假设有一个类别层次结构:

  • 电子产品(id = 1,parentId = null)
    • 相机(id = 3,parentId = 1)
    • 计算机(id = 4,parentId = 1)
    • 手机(id = 5,parentId = 1)
      • 手机和智能手机(id = 8,parentId = 5)
      • 手机配件(id = 9,parentId = 5)
  • 电机(id = 2,parentId = null)
    • 等(id = 6,parentId = 2)
    • 等(id = 7,parentId = 2)

我想要的是能够通过仅指定类别 id 来选择产品。

例如:假设我们想要获取 id = 1 类别下的所有产品
结果:我们从以下类别中获取所有产品:相机,电脑、手机(手机和智能手机+手机配件)

eg2:假设我们想要获取 id = 5 类别下的所有产品
结果:我们从以下位置获取所有产品:手机和智能手机 + 手机配件)

目前我只有这个查询:

With Categories_CTE As
(
    Select Id, Name, ParentId
    From category.Categories
    Where Id = **SOME CATEGORY ID**

    Union All
    Select t.Id, t.Name, t.ParentId
    From category.Categories t
    Inner Join Categories_CTE c On c.Id = t.ParentId
)

Select Id, Name, ParentId
From Categories_CTE;

这让我得到了类别的层次结构,但这不是我真正想要的......

那么,有没有人可以帮助我?

提前谢谢你。

【问题讨论】:

    标签: sql sql-server common-table-expression


    【解决方案1】:

    只需加入您所在位置的产品...

    With Categories_CTE As
    (
        Select Id, Name, ParentId
        From category.Categories
        Where Id = **SOME CATEGORY ID**
    
        Union All
        Select t.Id, t.Name, t.ParentId
        From category.Categories t
        Inner Join Categories_CTE c On c.Id = t.ParentId
    )
    
    Select p.*
    From Categories_CTE c INNER JOIN product.Products p on p.CategoryId = c.Id;
    

    注意:实际上不要在生产代码中使用 p.*,明确指定列。

    【讨论】:

    • 天哪,速度很快,而且似乎在工作......:)
    • 我无法在 mysql 中管理相同的查询。它给了我错误 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version
    【解决方案2】:

    这应该可以,但是没有数据来测试我不能确定:

    select p.*
    from products as p
    left join categories as c on (c.id = p.categoryid or c.parentid = p.categoryid)
    where p.categoryid = 1
    

    就像@Matt Whitfield 所说,您将要进行连接,但在这里使用left join 和or 子句允许您查找也仅与父ID 相关联的项目,以防发生奇怪的事情刚刚在“电子产品”下添加了一个项目。至少这是希望,因为没有日期,进行现场测试有点困难。

    【讨论】:

    • 不幸的是,您的解决方案没有按我的意愿工作,但无论如何谢谢!:)
    • 就像我说的那样,我不能确定它是否会在没有数据集的情况下按照您需要的方式工作,但它应该需要一点技巧才能开始工作以避免@ 987654324@.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多