SQL Server:用于从嵌套类别层次结构中获取产品的查询
我的SQL查询有问题。我这里有两个SQL Server表 第一个:SQL Server:用于从嵌套类别层次结构中获取产品的查询,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,我的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([P
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,父设备id=null
摄像机id=3,家长id=1
计算机id=4,父id=1
手机id=5,家长id=1
手机和智能手机id=8,家长id=5
手机配件id=9,家长id=5
马达id=2,父id=null
etc id=6,parentId=2
etc id=7,parentId=2
我想要的是能够通过只指定类别id来选择产品
e、 g:假设我们想要得到id=1的类别下的所有产品
结果:我们从以下类别获得所有产品:相机、电脑、带手机的手机和智能手机+手机配件
e、 g.2:假设我们想要得到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;
这让我得到了类别的层次结构,但这不是我真正想要的
有人能帮我吗
提前感谢您。只要加入您所在地的产品即可
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.*,请明确指定列。只需加入到您所在的产品中即可
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.*,请明确指定列。这应该可以工作,但如果没有要测试的数据,我无法确定:
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关联的项目,以防在电子设备下添加项目时发生奇怪的事情。至少这是希望,因为没有日期,进行现场测试有点困难。这应该可行,但如果没有数据进行测试,我无法确定:
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关联的项目,以防在电子设备下添加项目时发生奇怪的事情。至少这是希望,因为没有日期,做一个实时测试有点困难。天哪,速度太快了,似乎正在工作…:我无法在mysql中管理相同的查询。它给了我一个错误——您的SQL语法有一个错误;检查与您的MariaDB服务器版本相对应的手册Holy crap速度很快,似乎正在工作…:我无法在mysql中管理相同的查询。它给了我一个错误——您的SQL语法有一个错误;查看与您的MariaDB服务器版本对应的手册,很幸运,您的解决方案没有按我所希望的那样工作,但无论如何,谢谢!:正如我所说,我不能确定它是否能够按照您需要的方式工作,而无需数据集,但为了避免工会,它应该进行少量的调整。不幸的是,您的解决方案没有按照我希望的方式工作,但无论如何,谢谢!:就像我说的,我不能确定它是否能按照你需要的方式工作,没有数据集,但它应该需要一些小技巧才能开始工作,以避免工会。