2012-10-11 43 views
1

我想要得到的查詢返回屬於一個類別和子類別的所有項目。獲取返回與類別和子類別關聯的項目的查詢?

這裏的設置:

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(在Categorias Table中)鏈接的值。

另一個例子可以是,如果我代替鍵入WHERE B.IdCategoria = 2 ... 那麼它應該僅具有2 IdCategoria,4,5,6,7,示出了產品10或11。

我試着用這個查詢,它沒有工作。也許我不使用連接正確的方式...

我想知道,如果有人可以告訴我,我做錯了什麼,或者我有什麼要添加到查詢,使其工作.. 。

我希望你能幫助我提前

+0

您沒有提供對PRODUCTOS表數據。 –

+0

另外,CategoriasProductos插入缺少農佈雷列 –

+0

我對PRODUCTOS壞... 也許我需要一些例子,所以它會更容易說出哪些產品會出現... 農佈雷手段名稱,所以我不在這個例子中,認爲是非常必要的,因爲它僅用於用戶識別產品類別......我只插入了我所知道的對查詢而言很重要的數據 – Victor

回答

1

LEFT OUTER JOIN 感謝額外行不會帶給你的結果集。它會讓你帶來額外的列

你有什麼是分等級的種類。關於如何處理分層類別,SO和DBA.SE有許多問題。 SQL是不是在處理層次非常大,所以人們常常用像visitation numbers技巧(見Nested Sets)。我已經多次使用過這樣的技術,取得了巨大的成功。

在SO上有一個wiki,它提供了一套相當不錯的指向人們用來處理分層數據的其他方法的文章的鏈接。請記住,每一個都涉及某種形式的妥協。你只需要選擇一個在你的情況下最有利的權衡。