2

私はいくつかのテーブルを持っています

CREATE TABLE [dbo].[prods](
    [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
)

CREATE TABLE [dbo].[prodnuevos](
    [Codigo] [int] NULL,
    [itemid] [int] NULL,
    [Item] [varchar](255) NULL,
    [Categoria] [varchar](255) NULL,
    [Cantidad] [int] NULL,
    [Minima] [nvarchar](255) NULL,
    [Costo] [money] NULL,
    [Valor] [money] NULL,
    [peso] [float] NULL,
    [unidades] [float] NULL
)

両方のテーブルは多少似ており、両方に製品のリストがあり、prodnuevos (新製品のスペイン語と見なすことができます) には、prods (製品と呼びましょう) よりも拡張されたリストがあります。

私がやりたいのは、製品では利用できない新製品で利用可能なすべての行を挿入するクエリを使用することです...

この長いクエリを試しました

INSERT INTO prods (IdGrupo, IdAlmacen, Codigo, Nombre, Descripcion, Cantidad, Imagen, StockMin,StockMax, Ancho, Alto, Largo, Peso, Volumen, Color, Material, Presentacion, bitPrecioVentaUnico, PrecioCompra, DescuentoCompra, PrecioVenta, DescuentoVenta, Estado) 
VALUES (1, 'Ninguno', (Select prodnuevos.Codigo FROM prodnuevos LEFT JOIN prods ON prodnuevos.Item = prods.Nombre WHERE prods.Nombre IS NULL), (Select prodnuevos.Item FROM prodnuevos LEFT JOIN prods ON prodnuevos.Item = prods.Nombre WHERE prods.Nombre IS NULL), '', (Select prodnuevos.Cantidad FROM prodnuevos LEFT JOIN prods ON prodnuevos.Item = prods.Nombre WHERE prods.Nombre IS NULL), '', 0, 0, '', '', '', '', '', '', '', 'Ninguno', 0, (Select prodnuevos.Costo FROM prodnuevos LEFT JOIN prods ON prodnuevos.Item = prods.Nombre WHERE prods.Nombre IS NULL), 0, 0, 0, 'Activo');

これを試すと、次のエラーが表示されます

サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。

このクエリを適切に使用するにはどうすればよいでしょうか。

ところで、何度も繰り返すのではなく、サブクエリを少なくする方法もありませんか?

ありがとうございました

4

1 に答える 1

2

問題に間違った方法でアプローチするだけで、正しいアイデアが得られました。まずSELECT、コピーしたいデータを取得する結果セットを作成してから、次のINSERTようにプレフィックスを付ける必要があります。

INSERT INTO table VALUES (col1, col2)
SELECT col1, col2 FROM table2

INSERT ... VALUESまた、デフォルトがあり、子テーブルに存在しない列をリストに含める必要はありません。

于 2013-01-07T23:47:47.440 に答える