2013-01-07 29 views
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'); 

当我尝试,我得到了以下错误

子查询比返回多1值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。

我想知道如何正确使用此查询。

顺便说一下,是否还有一种方法,我可以使用较少的子查询,而不是重复它不同的次数?

谢谢

回答

2

你有正确的想法,只是接近问题的错误的方式。你应该先SELECT的结果集,将让你,你要复制过来的数据,然后用你的INSERT前缀它像这样:

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

你也不需要在你的INSERT ... VALUES列表列那有一个默认值,并不存在于你的子表中。

+0

+1好主意,从未这样想过 – exexzian

相关问题