Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:用于从嵌套类别层次结构中获取产品的查询_Sql_Sql Server_Common Table Expression - Fatal编程技术网

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

我的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,父设备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服务器版本对应的手册,很幸运,您的解决方案没有按我所希望的那样工作,但无论如何,谢谢!:正如我所说,我不能确定它是否能够按照您需要的方式工作,而无需数据集,但为了避免工会,它应该进行少量的调整。不幸的是,您的解决方案没有按照我希望的方式工作,但无论如何,谢谢!:就像我说的,我不能确定它是否能按照你需要的方式工作,没有数据集,但它应该需要一些小技巧才能开始工作,以避免工会。