我想得到一个查询,它返回属于一个类别和子类别的所有项目。
这是设置:
CREATE TABLE [dbo].[CategoriasProductos](
[IdCategoria] [int] IDENTITY(1,1) NOT NULL,
[IdGrupo] [int] NULL,
[Nombre] [varchar](50) NULL,
[Estado] [varchar](20) NULL,
[Descripcion] [text] NULL,
[IdCategoriaPadre] [int] NULL,
[Nivel] [nchar](10) NULL,
CONSTRAINT [PK_CategoriasProductos] PRIMARY KEY CLUSTERED
(
[IdCategoria] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
CREATE TABLE [dbo].[Productos](
[IdProducto] [int] IDENTITY(1,1) NOT NULL,
[IdGrupo] [int] NULL,
[IdCategoria] [int] NULL,
[IdAlmacen] [varchar](50) NULL,
[Codigo] [varchar](50) NULL,
[Nombre] [varchar](50) NULL,
[Descripcion] [varchar](max) NULL,
[Cantidad] [int] NULL,
[Imagen] [varchar](max) NULL,
[StockMin] [int] NULL,
[StockMax] [int] NULL,
[Ancho] [varchar](50) NULL,
[Alto] [varchar](50) NULL,
[Largo] [varchar](50) NULL,
[Peso] [varchar](50) NULL,
[Volumen] [varchar](50) NULL,
[Color] [varchar](50) NULL,
[Material] [varchar](50) NULL,
[Presentacion] [varchar](50) NULL,
[bitPrecioVentaUnico] [int] NULL,
[PrecioCompra] [money] NULL,
[DescuentoCompra] [float] NULL,
[PrecioVenta] [money] NULL,
[DescuentoVenta] [float] NULL,
[Estado] [varchar](20) NULL,
CONSTRAINT [PK_Productos] PRIMARY KEY CLUSTERED
(
[IdProducto] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
现在添加一些数据(至少仅针对类别)
SET IDENTITY_INSERT [dbo].[CategoriasProductos] ON
INSERT [dbo].[CategoriasProductos] ([IdCategoria], [IdCategoriaPadre], [Nivel]) VALUES (1, 1, N'0')
INSERT [dbo].[CategoriasProductos] ([IdCategoria], [IdCategoriaPadre], [Nivel]) VALUES (2, 1, N'1')
INSERT [dbo].[CategoriasProductos] ([IdCategoria], [IdCategoriaPadre], [Nivel]) VALUES (3, 1, N'1')
INSERT [dbo].[CategoriasProductos] ([IdCategoria], [IdCategoriaPadre], [Nivel]) VALUES (4, 2, N'2')
INSERT [dbo].[CategoriasProductos] ([IdCategoria], [IdCategoriaPadre], [Nivel]) VALUES (5, 2, N'2')
INSERT [dbo].[CategoriasProductos] ([IdCategoria], [IdCategoriaPadre], [Nivel]) VALUES (6, 4, N'3')
INSERT [dbo].[CategoriasProductos] ([IdCategoria], [IdCategoriaPadre], [Nivel]) VALUES (7, 4, N'3')
INSERT [dbo].[CategoriasProductos] ([IdCategoria], [IdCategoriaPadre], [Nivel]) VALUES (10, 5, N'3')
INSERT [dbo].[CategoriasProductos] ([IdCategoria], [IdCategoriaPadre], [Nivel]) VALUES (11, 5, N'3')
INSERT [dbo].[CategoriasProductos] ([IdCategoria], [IdCategoriaPadre], [Nivel]) VALUES (14, 3, N'2')
INSERT [dbo].[CategoriasProductos] ([IdCategoria], [IdCategoriaPadre], [Nivel]) VALUES (15, 3, N'2')
SET IDENTITY_INSERT [dbo].[CategoriasProductos] OFF
(我只插入了我知道查询将需要或可能需要的数据。此外,我的原始数据库中有更多行,但插入的行更少,只是为了不再使这变得复杂)
现在,我暂时尝试了这个查询:
SELECT Productos.Codigo, Productos.Nombre, Productos.Descripcion, A.Nombre AS Categoria
FROM Productos LEFT OUTER JOIN
CategoriasProductos AS A ON Productos.IdCategoria = A.IdCategoria LEFT OUTER JOIN
CategoriasProductos AS B ON B.IdCategoriaPadre = A.IdCategoria LEFT OUTER JOIN
CategoriasProductos AS C ON C.IdCategoriaPadre = B.IdCategoria LEFT OUTER JOIN
CategoriasProductos AS D ON D.IdCategoriaPadre = C.IdCategoria
WHERE (A.IdCategoria = 1)
还有一张我如何构建查询的图片:http: //imageshack.us/a/img841/7029/pruebau.jpg
现在......在查询中,它指出如果 A.IdCategoria = 1,(在这种情况下)它应该显示其 IdCategoria 等于 1 或等于以某种方式链接到 IdCategoria 1 的所有产品(在 Categoria桌子)。
另一个示例是,如果我改为键入 WHERE B.IdCategoria = 2... 那么它应该只显示 IdCategoria 为 2、4、5、6、7、10 或 11 的产品。
我尝试使用此查询,但没有成功。也许我没有以正确的方式使用连接......
我想知道是否有人可以告诉我我在这里做错了什么,或者我必须添加到查询中以使其工作......
我希望你能帮助我提前谢谢