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に何らかの形でリンクされている別の値に等しいすべての製品を表示する必要があることを示しています(カテゴリ内)テーブル)。

別の例として、代わりに WHERE B.IdCategoria = 2 と入力すると、IdCategoria が 2、4、5、6、7、10、または 11 の製品のみが表示されます。

このクエリを試してみましたが、うまくいきませんでした。たぶん私は正しい方法で結合を使用していません...

ここで私が間違っていること、またはそれを機能させるためにクエリに追加する必要があることを誰かに教えてもらえないかと思っていました...

よろしくお願いします。

4

1 に答える 1

1

LEFT OUTER JOIN結果セットに余分な行は含まれません。それはあなたが余分な列を持ち込むことを可能にするでしょう。

あなたが持っているのは階層的なカテゴリーです。SOとDBA.SEには、階層カテゴリの処理方法について多くの質問があります。SQLは階層の処理に優れていないため、訪問数などのトリックを使用することがよくあります(ネストされたセットも参照)。私はそのようなテクニックを何度も使用して大成功を収めました。

SOには、階層データを処理するために人々が使用する他の多くのアプローチに関する記事へのかなり良いリンクのセットを提供するwikiがあります。これらのそれぞれが何らかの形の妥協を伴うことを覚えておいてください。自分の状況でトレードオフが最も有益なものを選択する必要があります。

于 2012-10-12T11:57:03.250 に答える