2016-11-20 5 views
2

Я хотел бы вставить в таблицу данных таблицы из двух разных таблиц (Фамилия и имя). Более того, я хотел бы иметь третий столбец (электронная почта), который является конкатенированием с первых двух. когда я пытаюсь выполнить код ниже, он вызывает следующую ошибку: «Подзапрос возвращает более 1 значения».Ошибка в SQLServer: Подзапрос возвратил более 1 значения

insert into CLIENTS (LastName,Firstname, EMAIL) 
select (select top 150 Surname from Surname order by NEWID()), 
    (select top 150 Name from Name order by Newid()), 
    (select concat(concat(FisrtName, LastName),'@novaims.com') from clients); 

Не могли бы вы помочь мне разобраться, в чем проблема?

+0

Если вы хотите совместить каждую фамилию с каждым именем, вам нужно вступить в фамилию и имя в одном запросе вместо трех запросов. В вашем заявлении говорится: Вставьте новый клиент для каждого существующего клиента. Используйте (до) 150 фамилий как фамилию каждого нового клиента. Но у клиента может быть только одна фамилия. – mm759

ответ

0

Вам необходимо переместить ссылки на таблицу в пункт from. Я думаю, что это делает то, что вы хотите:

insert into CLIENTS (LastName, Firstname, EMAIL) 
    select surname, name, concat(name, surname, '@novaims.com') 
    from (select Surname, row_number() over (order by newid()) as seqnum 
      from Surname 
     ) s join 
     (select Name, row_number() over (order by newid()) as seqnum 
      from Name 
     ) 
     on n.seqnum = s.seqnum; 

Другого метод использует apply:

insert into CLIENTS (LastName, Firstname, EMAIL) 
    select top 150 s.surname, n.name, concat(n.name, s.surname, '@novaims.com') 
    from surname s cross apply 
     (select top 1 n.* 
      from names n 
      order by newid() 
     ) n 
    order by newid(); 

Это больше похоже на вашу оригинальную идею. Однако обратите внимание, что одно и то же имя может отображаться более одного раза. И производительность должна быть лучше для первой версии (потому что сортировка происходит только один раз на каждой таблице).

+0

'select 1 n. *'? –

1

Сообщение об ошибке очевидно, что ваш подзапрос может содержать более одной записи. Попробуйте это

;WITH cte 
    AS (SELECT 1 AS val 
     UNION ALL 
     SELECT val + 1 
     FROM cte 
     WHERE val < 150) 
SELECT FisrtName, 
     LastName, 
     Concat(FisrtName, LastName, '@novaims.com') 
FROM cte 
     OUTER apply (SELECT TOP 1 Surname FROM Surname ORDER BY Newid()) s (FisrtName) 
     OUTER apply (SELECT TOP 1 NAME FROM NAME ORDER BY Newid()) n (LastName) 
    Option (Maxrecursion 0) 
+0

Я попытался, и он возвратил следующее сообщение: «Оператор завершен. Максимальная рекурсия 100 была исчерпана до завершения инструкции». и ошибка была в первой строке кода –

+0

Да, по умолчанию она составляет всего 100 рекурсий. Обновленная проверка ow –

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