【问题标题】:Rewrite this INSERT *without* the subquery, please?重写这个 INSERT *without* 子查询,好吗?
【发布时间】:2012-02-23 18:16:22
【问题描述】:

如何在没有子查询的情况下重写此 INSERT 语句,从而不再导致错误“在此上下文中不允许子查询。只允许标量表达式”?

INSERT INTO FUNCTIONAL_AREA (
  FUNCTIONAL_AREA_UUID
  ,FUNCTIONAL_CATEGORY_UUID  
  ,CREATE_DATETIME 
  ,CREATE_USER 
  ,LUPDATE_DATETIME
  ,LUPDATE_USER 
  ,DESCRIPTION
  ,ITEM_CODE
  ,IS_ACTIVE 
) VALUES ( 
 NEWID()  
 ,(select functional_category_uuid from functional_category where description = 'ADLs')
 ,GETDATE()
 ,'11111111-1111-1111-1111-111111111111'
 ,GETDATE()
 ,'11111111-1111-1111-1111-111111111111'
 ,'Bathing - Ability' 
 ,1081
 ,1)

谢谢!

【问题讨论】:

  • 选择 NEWID() ,functional_category_uuid,GETDATE() ,'11111111-1111-1111-1111-111111111111' ,GETDATE() ,'11111111-1111-1111-1111-111111111111','能力' ,1081 ,1 来自functional_category where description = 'ADLs'
  • 那么,子查询是否返回不止一行?您打算插入一行还是多行?

标签: sql-server insert subquery


【解决方案1】:
INSERT INTO FUNCTIONAL_AREA (
  FUNCTIONAL_AREA_UUID
  ,FUNCTIONAL_CATEGORY_UUID  
  ,CREATE_DATETIME 
  ,CREATE_USER 
  ,LUPDATE_DATETIME
  ,LUPDATE_USER 
  ,DESCRIPTION
  ,ITEM_CODE
  ,IS_ACTIVE 
)
select NEWID()  
 ,functional_category_uuid 
 ,GETDATE()
 ,'11111111-1111-1111-1111-111111111111'
 ,GETDATE()
 ,'11111111-1111-1111-1111-111111111111'
 ,'Bathing - Ability' 
 ,1081
 ,1
from functional_category 
where description = 'ADLs'

编辑添加:

如果您只想插入一行,并且关心从功能类别中选择哪一行,那么要么缩小 where 子句,只返回一行,要么使用 order by 和 top 1:

INSERT INTO FUNCTIONAL_AREA (
  FUNCTIONAL_AREA_UUID
  ,FUNCTIONAL_CATEGORY_UUID  
  ,CREATE_DATETIME 
  ,CREATE_USER 
  ,LUPDATE_DATETIME
  ,LUPDATE_USER 
  ,DESCRIPTION
  ,ITEM_CODE
  ,IS_ACTIVE 
)
select top 1 NEWID()  
 ,functional_category_uuid 
 ,GETDATE()
 ,'11111111-1111-1111-1111-111111111111'
 ,GETDATE()
 ,'11111111-1111-1111-1111-111111111111'
 ,'Bathing - Ability' 
 ,1081
 ,1
from functional_category 
where description = 'ADLs'
order by <criteria that causes the correct row to be first>

【讨论】:

    【解决方案2】:

    您收到此错误的原因是 VALUES 子句限制您插入一行。当您将子查询作为列之一时,这可能会导致多个值。

    您可以像其他人展示的那样执行“选择”插入,也可以将值写入变量并在子查询返回多行时使用 TOP 1 子句。

    【讨论】:

      【解决方案3】:

      如果您想在所有情况下都只插入一行,请稍作修正:

      INSERT    INTO FUNCTIONAL_AREA (
                FUNCTIONAL_AREA_UUID,
                FUNCTIONAL_CATEGORY_UUID,
                CREATE_DATETIME,
                CREATE_USER,
                LUPDATE_DATETIME,
                LUPDATE_USER,
                DESCRIPTION,
                ITEM_CODE,
                IS_ACTIVE)
      SELECT    TOP (1) NEWID(),
                functional_category_uuid,
                GETDATE(),
                '11111111-1111-1111-1111-111111111111',
                GETDATE(),
                '11111111-1111-1111-1111-111111111111',
                'Bathing - Ability',
                1081,
                1
      FROM      functional_category 
      WHERE     description = 'ADLs'
      

      DECLARE @category_uuid uniqueidentifier
      
      SELECT    @category_uuid = functional_category_uuid
      FROM      functional_category 
      WHERE     description = 'ADLs'
      
      INSERT    INTO FUNCTIONAL_AREA (
                FUNCTIONAL_AREA_UUID,
                FUNCTIONAL_CATEGORY_UUID,
                CREATE_DATETIME,
                CREATE_USER,
                LUPDATE_DATETIME,
                LUPDATE_USER,
                DESCRIPTION,
                ITEM_CODE,
                IS_ACTIVE)
      VALUES(   NEWID(),
                @category_uuid,
                GETDATE(),
                '11111111-1111-1111-1111-111111111111',
                GETDATE(),
                '11111111-1111-1111-1111-111111111111',
                'Bathing - Ability',
                1081,
                1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-14
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多