Многократная вставка SQL с общим выбором - PullRequest
4 голосов
/ 14 февраля 2012

Мне нужно вставить данные в таблицу со следующим шаблоном

INSERT INTO tablename (a, b) VALUES (
    (123, (SELECT foo FROM someothertable WHERE some_condition)),
    (456, (SELECT foo FROM someothertable WHERE some_condition)),
    (789, (SELECT foo FROM someothertable WHERE some_condition)),
    ...

Все вставленные строки имеют одинаковое значение для столбца b, и я хочу выделить их.Я мог бы вручную выполнить выборку и вставить значение, но это нарушит инкапсуляцию в наборе сценариев, которые я пишу.

Можно ли сделать это на чистом SQL в рамках того же запроса?

Ответы [ 5 ]

3 голосов
/ 14 февраля 2012
INSERT INTO tablename (a, b)
SELECT X.bar, S.foo
FROM someothertable S
   CROSS JOIN
   (SELECT 123 AS bar UNION ALL SELECT 456 UNION ALL SELECT 789) X
WHERE some_condition
2 голосов
/ 14 февраля 2012

Объявите переменную с этим значением и используйте ее на вставках.

Предполагая, что foo - это `varchar (10), это будет примерно так:

declare @toInsert varchar(10)

select @toInsert = foo FROM someothertable WHERE some_condition

INSERT INTO tablename (a, b) VALUES (
    (123, @toInsert),
    (456, @toInsert),
    (789, @toInsert),
1 голос
/ 14 февраля 2012
INSERT INTO tablename (a, b) 
  SELECT a, b
  FROM
      ( SELECT 123 AS a UNION
        SELECT 456 UNION
        ...  
        SELECT 789 
      ) AS aa
    CROSS JOIN 
      ( SELECT foo AS b FROM someothertable WHERE some_condition ) AS bb
0 голосов
/ 14 февраля 2012

Вот два способа, которые избегают повторения подвыбора, но не являются строго «в одном запросе»:

1) Использовать временную переменную

SET @b = SELECT foo FROM someothertable WHERE somecondition;
INSERT INTO tablename(a, b) VALUES (
  (1, @b),
  (2, @b),
  ...

2) Используйте insert для настройки столбца a, затем используйте update для установки столбца b. Это может быть организовано во временную таблицу.

CREATE TEMPORARY TABLE tmp LIKE tablename;
insert into tmp(a) values (1),(2),...
update tmp set b = select foo from someothertable where some_condition;
insert into tablename(a,b) select * from tmp;
0 голосов
/ 14 февраля 2012

вот что я имел ввиду:

create table tableName (
a varchar(50),
b varchar(50))

create table someothertable (
keyToTableName varchar(50),
someOtherA varchar(50))

insert into someothertable values('a', 'otherA')
insert into someothertable values('b', 'otherB')

insert into tableName
select 'a', someOtherA from someothertable where keyToTableName='a' UNION
select 'b', someOtherA from someothertable where keyToTableName='b' 
...