Перепишите этот INSERT * без * подзапроса, пожалуйста? - PullRequest
1 голос
/ 23 февраля 2012

Как этот оператор 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)

Спасибо!

Ответы [ 3 ]

4 голосов
/ 23 февраля 2012
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'

РЕДАКТИРОВАТЬ Добавление:

Если вы хотите, чтобы вставлялась только одна строка, и вас интересует, какая строка выбрана из functions_category, то либо сузьте предложение where, чтобы возвращалась только одна строка, либо используйте порядок по началу 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>
0 голосов
/ 24 февраля 2012

Небольшое исправление, если вы хотите вставить ровно одну строку во всех случаях:

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)
0 голосов
/ 24 февраля 2012

Причина, по которой вы получаете эту ошибку, заключается в том, что предложение VALUES ограничивает вас вставкой одной строки.Если у вас есть подзапрос в качестве одного из столбцов, это может привести к более чем одному значению.

Вы можете либо выполнить вставку 'select', как это показали другие, либо вы можете записать значение в переменную ииспользуйте предложение TOP 1, если подзапрос возвращает более одной строки.

...