Мне нужно вставить записи в одну таблицу, которые будут иметь новый первичный ключ в той же таблице, и использовать их для вставки в другую таблицу:
У меня в таблице 1:
╔════════════════╦═══════╦═══════╦═══════╗
║ id_colum (key) ║ desc1 ║ desc2 ║ desc3 ║
╠════════════════╬═══════╬═══════╬═══════╣
║ AAAA ║ x ║ x ║ x ║
╠════════════════╬═══════╬═══════╬═══════╣
║ AAAB ║ x ║ x ║ x ║
╠════════════════╬═══════╬═══════╬═══════╣
║ AAAC ║ x ║ x ║ x ║
╠════════════════╬═══════╬═══════╬═══════╣
║ AAAD ║ x ║ x ║ x ║
╠════════════════╬═══════╬═══════╬═══════╣
║ AAAE ║ x ║ x ║ X ║
╚════════════════╩═══════╩═══════╩═══════╝
и в таблице 2
╔════════════════════════╦════╦═══════╦═══════╦═══════╗
║ id_colum (foreign key) ║ id ║ desc1 ║ desc2 ║ desc3 ║
╠════════════════════════╬════╬═══════╬═══════╬═══════╣
║ AAAA ║ 1 ║ x ║ x ║ x ║
╠════════════════════════╬════╬═══════╬═══════╬═══════╣
║ AAAA ║ 2 ║ x ║ x ║ x ║
╠════════════════════════╬════╬═══════╬═══════╬═══════╣
║ AAAC ║ 3 ║ x ║ x ║ x ║
╠════════════════════════╬════╬═══════╬═══════╬═══════╣
║ AAAC ║ 4 ║ x ║ x ║ x ║
╠════════════════════════╬════╬═══════╬═══════╬═══════╣
║ AAAC ║ 5 ║ x ║ x ║ X ║
╚════════════════════════╩════╩═══════╩═══════╩═══════╝
и у меня есть записи в обеих таблицах (50 таблица 1 и 200 таблица 2, чтобы дать представление об отношении), теперь у меня есть подгруппа этих записей, которую мне нужно вставить в обе таблицы, поэтому у меня есть таблица 1, которая сгенерирует ключи, и мне нужно добавить еще и в таблицу 2, но с использованием id_colum, который придет после добавления в таблицу1. Я пробую разные комбинации, но не получаю нужного результата. Я попытался объединить обе таблицы
SELECT *
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id_colum = t2.id_colum
WHERE t1.id_colum IN('AAAA', 'AAAB', 'AAAC');
но тогда я застрял на том, как вставка будет работать для него
(Короче говоря, мне нужно вставить новые значения в таблицы на основе значений, которые у меня есть, но с сохранением ключевого отношения)
Можешь попробовать:
ВСТАВИТЬ В таблицу2 (id_colum, desc1, desc2, desc3) ВЫБРАТЬ id_colum, desc1, desc2, desc3 ИЗ таблицы1
@ Baldie47 Вы имели в виду вот это? code
ВСТАВИТЬ В таблицу1 (id_colum, desc1, desc2, desc3) ВСТАВИТЬ В таблицу2 (id_colum, desc1, desc2, desc3) ВЫБРАТЬ id_colum, desc1, desc2, desc3 ИЗ таблицы1 code
нет, значения для id_colum в таблице 1 генерируются автоматически при выполнении вставки, мне нужно выполнить вставку в эту таблицу и использовать ключи, сгенерированные как столбцы в таблице 2 на основе вашего запроса, который я могу сделать: INSERT INTO table1 ( desc1, desc2, desc3) INSERT INTO table2(id_colum (сгенерированный после вставки таблицы 1), desc1, desc2, desc3) SELECT id_colum,desc1, desc2, desc3 FROM table1 t1 LEFT JOIN table2 t2 ON t1.id_colum = t2.id_colum ГДЕ t1.id_colum IN('АААА', 'АААВ', 'АААС'); вы понимаете, что я имею в виду?
Пример: вставить таблицу1: ВСТАВИТЬ В таблицу1(описание1,описание2,описание3) ЗНАЧЕНИЯ('x','x','x') ВСТАВИТЬ В таблицу1(описание1,описание2,описание3) ЗНАЧЕНИЯ('x','x',' x') INSERT INTO table1( desc1, desc2, desc3) VALUES ('x','x','x') После вставки table2 INSERT INTO table2(id_colum, desc1, desc2, desc3) SELECT t1.id_colum, t1.desc1 , t1.desc2, t1.desc3 FROM table1 t1 LEFT JOIN table2 t2 ON t1.id_colum = t2.id_colum WHERE t1.id_colum IN(1, 3); Может быть, я не понимаю, что вы имеете в виду. Ха-ха :D
Это зависит от того, какая структура базы данных у вас уже есть. Если вы используете SEQUENCE
вместо PRIMARY KEY
, то это очень легко сделать.
Допустим, у вас есть такая структура:
CREATE SEQUENCE dbo.seq_cityId START WITH 1;
CREATE TABLE City
(
CityId INT PRIMARY KEY DEFAULT (NEXT VALUE FOR dbo.seq_cityId),
CityName NVARCHAR(50) NOT NULL
);
CREATE TABLE CityDetails
(
CityId INT PRIMARY KEY REFERENCES City (CityId),
LatestRecordedPopulation BIGINT
);
Затем, если вы хотите заполнить эти таблицы вместе, вы можете создать временную промежуточную таблицу, например:
SELECT NEXT VALUE FOR dbo.seq_cityId as CityId, *
INTO #StagingTable
FROM (VALUES ('San Francisco', 805235),
('Buffalo', 261310),
('Seattle', 608660)) R (CityName, Population);
INSERT INTO City
SELECT CityId, CityName
FROM #StagingTable
INSERT INTO CityDetails
SELECT CityId, Population
FROM #StagingTable
Если вы используете IDENTITY
, это означает вместо:
CityId INT PRIMARY KEY DEFAULT (NEXT VALUE FOR dbo.seq_cityId)
в вашей структуре таблицы City у вас есть:
CityId INT IDENTITY(1,1) PRIMARY KEY
Тогда решение немного сложное:
SELECT *
INTO #StagingTable
FROM (VALUES ('San Francisco', 805235),
('Buffalo', 261310),
('Seattle', 608660)) R (CityName, Population);
DECLARE @OutputCities TABLE (CityId INT, CityName NVARCHAR(MAX));
INSERT INTO City
OUTPUT inserted.CityId, inserted.CityName INTO @OutputCities
SELECT CityName
FROM #StagingTable
INSERT INTO CityDetails
SELECT CityId, Population
FROM @OutputCities OC
JOIN #StagingTable ST ON ST.CityName = OC.CityName
Поскольку вы вставляете более одной записи, вы не можете использовать SCOPE_IDENTITY()
, и тогда лучший вариант — использовать таблицу перекрестных ссылок для таких вещей, как #StagingTable и @OutputCities в этом примере. Во втором примере столбец IDENTITY
с именем CityName является уникальным идентификатором, поэтому для этих решений всегда нужно находить уникальный идентификатор.
Я не понимаю, как это будет работать, ключ генерируется при вставке в таблицу1, в вашем запросе нет вставки в эту таблицу