sql - 如何使用不同的子查询在表中插入多行

标签 sql sql-server insert

我有几张 table

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');

当我尝试此操作时,出现以下错误

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

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

顺便问一下,是否还有一种方法可以使用更少的子查询而不是重复多次?

谢谢

最佳答案

你的想法是正确的,只是解决问题的方式错误。您应该首先SELECT一个结果集,该结果集将为您提供要复制的数据,然后在其前面加上INSERT前缀,如下所示:

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

您也不需要在 INSERT ... VALUES 列表中包含具有默认值且子表中不存在的列。

关于sql - 如何使用不同的子查询在表中插入多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14206029/

相关文章:

php - 在 PHP 中循环插入查询

sql - CONTEXT_INFO() 和转换

sql - 如何在 SQL 中循环连接?

php - 插入查询foreach循环麻烦

MySQL 触发器问题

sql - 当 WHERE 子句返回高比例的行时,Azure SQL 查询性能会显着降低

mysql - 一系列值和一个值的 SQL 查询

mysql - 共享租户对象

c# - 如何查找已安装的sql server 2014实例名称和版本?

MySQL 批量插入(忽略主键 ID,但重复更新另一个键)