Я собираюсь создать новую таблицу (PersonInformation) со столбцами другого (Members) и еще несколькими столбцами, такими как «Имя пользователя», «Пароль» и «PersonId».
Я использовал команду: 'INSERT INTO myTable (Columns_in_PersonInformation...) SELECT (Columns_in_Members + new_columns) FROM Members, PersonInformation ГДЕ Members.id = PersonInformation.PersonId'
У меня две проблемы: первый, когда таблица PersonInformation пуста. Результатом является «затронуто 0 строк» второй, когда я добавляю одну строку в таблицу PersonInformation, при каждом запуске код добавляет строки экспоненциально (2, 4, 8, 16, 32,...).
Вот мой код: '''
INSERT INTO dbo.PersonInformation (FirstName, LastName, PhoneNumber, EmailAddress, PersonId, Username, Password)
SELECT dbo.Members.FirstName,dbo.Members.LastName, dbo.Members.PhoneNumber, dbo.Members.EmailAddress ,@PersonId, @Username, @Pass
FROM dbo.Members , dbo.PersonInformation
WHERE dbo.Members.id = dbo.PersonInformation.PersonId
'''
JOIN
в стандарте SQL ANSI-92 (30 лет!! назад), и его использование не рекомендуется.
Первый, когда таблица PersonInformation пуста — вы можете использовать левое соединение в запросе ниже. Это принесет данные от участников, даже если информация о человеке пуста.
Второй, когда я добавляю одну строку в таблицу PersonInformation - данные увеличиваются в геометрической прогрессии : используйте приведенный ниже синтаксис соединения, который может отличаться в запросе.
INSERT INTO dbo.PersonInformation (FirstName, LastName, PhoneNumber, EmailAddress, PersonId, Username, Password)
SELECT members.FirstName,members.LastName, members.PhoneNumber, dbo.Members.EmailAddress ,@PersonId, @Username, @Pass
FROM dbo.Members members INNER JOIN dbo.PersonInformation pii
ON members.id = pii.PersonId
Вы можете изменить его на RIGHT JOIN с проверкой DISTINCT или NULL в соответствии с вашим условием.
Если вам нужна только одна запись из таблицы pii, используйте ВЫБЕРИТЕ ВЕРХНИЙ 1 CTE или КРЕСТ применять.
Спасибо, Амит. Да, вы правы насчет первого вопроса, но проблема в том, что когда я использую LEFT JOIN, таблица Member полностью копируется в таблицу PersonInformation, чего я не хочу. Я хочу, чтобы только одна строка с этим условием «Members.id = @PersonId» была скопирована в таблицу PersonInformation, а также добавить «Имя пользователя», «Пароль» и «PersonID» из строки.
Обновлен ответ на включение одной записи из таблицы pii
Спасибо за помощь, Амит,
Вторая проблема решена со следующими изменениями:
INSERT INTO dbo.PersonInformation (FirstName, LastName, PhoneNumber, EmailAddress, PersonId, Username, Password)
SELECT DISTINCT dbo.Members.FirstName,dbo.Members.LastName, dbo.Members.PhoneNumber, dbo.Members.EmailAddress ,@PersonId, @Username, @Pass
FROM Members INNER JOIN dbo.PersonInformation
ON Members.id = @PersonId
Первая проблема все еще сохраняется, но я пока добавил в таблицу фиктивную строку.
можете ли вы написать скрипт, чтобы более подробно объяснить вашу проблему sqlfiddle.com