2014-03-17 3 views
0

Я использую этот SQL для создания кросс-соединения и вставки результатов в третью таблицу. Любые идеи, почему это не работает? Кросс-соединение работает, когда запускается само по себе. Вставка также работает автономно, но не тогда, когда эти инструкции wo объединяются.Как вставить результаты перекрестного соединения в другую таблицу?

INSERT INTO Person (FirstName, LastName) 
VALUES (Select fn.Name, ln.Name from FirstName as fn cross join LastName as ln); 

ответ

5

Вы хотите insert . . . select синтаксис:

INSERT INTO Person(FirstName, LastName) 
    Select fn.Name, ln.Name 
    from FirstName as fn cross join LastName as ln; 
2

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

INSERT INTO Person (FirstName, LastName) Values (Select fn.Name, ln.Name from FirstName as fn cross join LastName as ln) 

Следующая SQL должно работать: (Этот код фактически не работает - см. Ниже обновление)

INSERT INTO Person 
SELECT 
    FirstName = fn.Name, 
    LastName = ln.Name 
FROM FirstName AS fn 
CROSS JOIN LastName AS ln 

При использовании SELECT оператора для вставки значения не нужно использовать синтаксис INSERT INTO tableName (...CSV of column names...) VALUES (... CSV of values ...), который предназначен для вставки в явном виде определяется (Также не совсем точно - см ниже обновление):

INSERT INTO Person 
    (FirstName, LastName) 
VALUES 
    ('John','Smith') 
    ,('Jane','Doe')` 

Update & код коррекции из-за комментариев добавил Стюарт Эйнсворт:

следующий код был обновлен из-за полученных замечаний, я KEP t приведенный выше код тот же для справки (о том, как это не делать!) и держать комментарии релевантными, однако следует отметить, что, как указано и продемонстрировано в скрипте SQL, предыдущий код не будет работать.

В примере, который будет работать, используется шаблон INSERT INSERT INTO (... CSV of values ...) SELECT ... FROM ... etc.... В отличие от ранее указанных, определение столбцов как с INSERT INTO (... CSV of values ...) НЕ предназначено для явных введений и может использоваться с оператором select. (Ниже также теперь почти так же, как и принятый ответ выше.)

INSERT INTO Person 
    (FirstName, LastName) 
SELECT 
    fn.Name 
    ,ln.Name 
FROM FirstName AS fn 
CROSS JOIN LastName AS ln 
+2

Ваше предложение будет работать, если предположить, что таблица PERSON имеет только два столбца, которые находятся в том же порядке, что и ЗЕЬЕСТ (имя, Фамилия). Идеальным решением было бы указать имена столбцов как часть предложения INSERT. –

+0

Возможно, вы правы, но по моему опыту, потому что имена столбцов были явно определены, например. 'FirstName = fn.Name', если нет других полей, которые необходимы, чтобы они успешно работали. (Хотя справедливости ради, если есть другие поля, которые требуются, любое из вышеуказанных решений не будет работать) – talegna

+1

http://sqlfiddle.com/#!3/b6389/10 –

Смежные вопросы