ВСТАВИТЬ запрос с помощью запроса ВЫБОРА?

#sql #sql-server #sql-server-2008 #tsql

#sql #sql-сервер #sql-server-2008 #tsql

Вопрос:

У меня есть следующий оператор INSERT:

 INSERT INTO [StoreTestDB].[dbo].[KitItem]
           ([KitItemGUID]
           ,[KitGroupID]
           ,[Name]
           ,[Description]
           ,[PriceDelta]
           ,[WeightDelta]
           ,[IsDefault]
           ,[DisplayOrder]
           ,[ExtensionData]
           ,[TextOptionMaxLength]
           ,[TextOptionWidth]
           ,[TextOptionHeight]
           ,[InventoryVariantID]
           ,[InventoryVariantColor]
           ,[InventoryVariantSize]
           ,[CreatedOn])
VALUES
...
...
...
 

Мне нужно выполнить еще один запрос, чтобы узнать идентификатор KitGroupID на основе имени, которое будет шрифтом.

Вот как я примерно хочу это сделать:

 SELECT TOP1 (KitGroupID)
FROM KitGroup
WHERE Name = "Font"
AND ProductID = 157
 

У меня около 30 идентификаторов продукта, и у меня много шрифтов.

Мне нужно запустить инструкцию insert, затем во время ее выполнения мне нужен запрос select, чтобы узнать KitGroupID, чтобы затем завершить вставку. Есть ли в этом смысл?

Как я могу это сделать, я новичок в SQL .. Заранее спасибо

Комментарии:

1. Извините, но для меня это не имеет смысла, вы собираетесь ВСТАВИТЬ в KITGROUP и ВЫБРАТЬ из KITGROUP одновременно?

2. Он вставляет в KITITEM, а не в KITGROUP

Ответ №1:

Вы можете INSERT SELECT использовать оператор и включить в него множество литералов SELECT :

 INSERT [StoreTestDB].[dbo].[KitItem]
     -- all your column names
SELECT TOP 1
    'Value',
    23,
    [KitGroupId],
    'More values',
    -- ...
FROM [KitGroup] WHERE ...
 

Комментарии:

1. что вы называете такого рода запросом, я хотел бы прочитать об этом?

2. Это запрос ВСТАВКИ с использованием производной таблицы.

3. пожалуйста, посмотрите на мой пример, я все еще не понимаю, как оператор select добавит значения к insert?

4. @PD24 Есть два способа INSERT передачи данных — вы можете использовать VALUES , или вы можете использовать SELECT . В вашем исходном примере, если вы измените VALUES ( 'value1', 'value2', etc ) значение на SELECT 'value1', 'value2', etc , вы увидите, что оба вставляют одно и то же.

Ответ №2:

Вы можете сделать так:

 INSERT INTO [StoreTestDB].[dbo].[KitItem]
           ([KitItemGUID]
           ,[KitGroupID]
           ,[Name]
           ,[Description]
           ,[PriceDelta]
           ,[WeightDelta]
           ,[IsDefault]
           ,[DisplayOrder]
           ,[ExtensionData]
           ,[TextOptionMaxLength]
           ,[TextOptionWidth]
           ,[TextOptionHeight]
           ,[InventoryVariantID]
           ,[InventoryVariantColor]
           ,[InventoryVariantSize]
           ,[CreatedOn])
SELECT 
  NEWID(),
  (
    SELECT TOP1 (KitGroupID)
    FROM KitGroup
    WHERE Name = "Font"
    AND ProductID = 157
  )
  , anotherConstantValue ...
 

Комментарии:

1. anotherConstantValue … ? что это значит?

2. То же, что и ваше «…» или «Дополнительные значения» Кирка. Ответ Киркса немного более элегантный, чем мой, ПРИ условии, что для идентификатора продукта и имени всегда есть значение KitGroup. Если записи нет, то в моем ответе будет предпринята попытка вставки NULL в KitValue. KitGroupId тогда как запрос Кирка вообще не вставит запись в этом экземпляре.

3. как вы называете такого рода запросы?

4. ВСТАВКА ..ЗНАЧЕНИЯ не является единственной формой вставки — вы также можете ВСТАВИТЬ… ВЫБЕРИТЕ (вставьте несколько строк, обычно из других таблиц) и ВСТАВЬТЕ… ВЫПОЛНИТЬ (т. е. Вставить выходные данные процедуры). Смотрите Примеры MSDN здесь — msdn.microsoft.com/en-us/library/dd776381.aspx

Ответ №3:

Вот мой sql:

 INSERT INSERT INTO [StoreTestDB].[dbo].[KitItem]([KitGroupID],[Name],[PriceDelta],[WeightDelta],[IsDefault],[DisplayOrder],[InventoryVariantID]) VALUES (17,'<ml><locale name="en-GB">Gaudi</locale></ml>',0,0,1,1,0)       
SELECT TOP (1) KitGroupID, Name, ProductID FROM KitGroup WHERE (Name = 'Fonts') AND (ProductID = 157)
 

Комментарии:

1. Просто любопытно: каким образом ваш ВЫБОР завершает вашу ВСТАВКУ?